[Crash-utility] [PATCH] raw_data_dump: display only 8/16/32 bits if requested

Dominique Martinet asmadeus at codewreck.org
Thu Apr 2 17:12:15 UTC 2020


Previously, calling raw_data_dump() with e.g. len 4 on 64bit systems
would dump 8 bytes anyway, making it hard to tell what one wants to see.

For example, with task_struct.rt_priority a uint32.
before patch:
crash> struct -r task_struct.rt_priority ffff8d9b36186180
ffff8d9b361861dc:  9741dec000000063                    c.....A.

after patch:
crash-patched> struct -r task_struct.rt_priority ffff8d9b36186180
ffff8d9b361861dc:  00000063                              c...
---

Here's the promised follow-up.

Two remarks:
 - I wasn't sure about an explicit DISPLAY_64 flag, but if we're 32bit
and want to print 8 bytes it is just as likely to be two entities than
a single one so it makes more sense to leave default to me.
 - I wasn't sure on what to do if someone wants to print some odd size,
e.g. 6 bits? Should that be DISPLAY_8 anyway?
I tried on some bitmap and it looks like raw_data_dump is called with 8
anyway even if the bitmap part is less than 8, I'm not sure this can
ever be called with weird values, so probably best left as is.

Thanks!

 memory.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/memory.c b/memory.c
index 4f7b6a0..ccc2944 100644
--- a/memory.c
+++ b/memory.c
@@ -2113,6 +2113,7 @@ raw_data_dump(ulong addr, long count, int symbolic)
 	long wordcnt;
 	ulonglong address;
 	int memtype;
+	ulong flags = HEXADECIMAL;
 
 	switch (sizeof(long))
 	{
@@ -2132,6 +2133,22 @@ raw_data_dump(ulong addr, long count, int symbolic)
 		break;
 	}
 
+	switch (count)
+	{
+	case SIZEOF_8BIT:
+		flags |= DISPLAY_8;
+		break;
+	case SIZEOF_16BIT:
+		flags |= DISPLAY_16;
+		break;
+	case SIZEOF_32BIT:
+		flags |= DISPLAY_32;
+		break;
+	default:
+		flags |= DISPLAY_DEFAULT;
+		break;
+	}
+
 	if (pc->curcmd_flags & MEMTYPE_FILEADDR) {
 		address = pc->curcmd_private;
 		memtype = FILEADDR;
@@ -2144,7 +2161,7 @@ raw_data_dump(ulong addr, long count, int symbolic)
 	}
 
 	display_memory(address, wordcnt, 
- 	    HEXADECIMAL|DISPLAY_DEFAULT|(symbolic ? SYMBOLIC : ASCII_ENDLINE),
+		flags|(symbolic ? SYMBOLIC : ASCII_ENDLINE),
 		memtype, NULL);
 }
 
-- 
2.26.0





More information about the Crash-utility mailing list