diff options
author | Neal H. Walfield <neal@gnu.org> | 2009-02-19 19:16:14 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@gnu.org> | 2009-02-19 19:16:14 +0100 |
commit | fc9784bcdfd8adaa0d96572466195ef43b993c8b (patch) | |
tree | 68802a77dc72085e1d83565abed7d5de388cfa51 /viengoos | |
parent | ee4b520e643c9f51fdb51a5267a988a0e50937eb (diff) |
Improve memory dump's output.
Diffstat (limited to 'viengoos')
-rw-r--r-- | viengoos/object.c | 79 |
1 files changed, 67 insertions, 12 deletions
diff --git a/viengoos/object.c b/viengoos/object.c index 946800e..7af2de9 100644 --- a/viengoos/object.c +++ b/viengoos/object.c @@ -106,7 +106,7 @@ object_debug_command (int argc, char *argv[]) int i; printf ("\n"); - int skip; + int skip = 0; for (i = 0; i < PAGESIZE / sizeof (uint64_t); i += 4) if (((uint64_t *) object)[i] == 0 && ((uint64_t *) object)[i + 1] == 0 @@ -118,7 +118,7 @@ object_debug_command (int argc, char *argv[]) if (skip > 0) { printf ("Skipped %d zero bytes.\n", - 4 * skip * sizeof (uint64_t)); + (int) 4 * skip * sizeof (uint64_t)); skip = 0; } printf ("%3x: %016"PRIxPTR" %016"PRIxPTR @@ -148,12 +148,12 @@ memory_debug_command (int argc, char *argv[]) { if (argc < 2) { - printf ("Usage: address [count]\n"); + printf ("Usage: address [count=32]\n"); return; } - uintptr_t *addr = (uintptr_t *) strtoul (argv[1], NULL, 16); - int count = sizeof (uintptr_t) * 4; + unsigned char *addr = (unsigned char *) strtoul (argv[1], NULL, 16); + int count = sizeof (uint64_t) * 4; if (argc > 2) count = strtol (argv[2], NULL, 0); @@ -164,16 +164,71 @@ memory_debug_command (int argc, char *argv[]) addr -= count; } - int cells = 0; - for (; count > 0; count -= sizeof (uintptr_t)) + if (((uintptr_t) addr & ((sizeof (uint64_t) * 4) - 1)) != 0) { - if (cells ++ % 4 == 0) + if (sizeof (uintptr_t) == 8) + printf ("%016"PRIxPTR": ", (uintptr_t) addr); + else + printf ("%08"PRIxPTR": ", (uintptr_t) addr); + + uintptr_t a = ((uintptr_t) addr & ~((sizeof (uint64_t) * 4) - 1)); + while (a < (uintptr_t) addr) { - printf ("\n"); - printf ("%016"PRIxPTR":", (uintptr_t) addr); + printf (" "); + a ++; + if ((a & (sizeof (uint64_t) - 1)) == 0) + printf (" "); } - printf (" %016"PRIxPTR, *addr); - addr ++; + } + + int skipped = 0; + while (count > 0) + { + if (((uintptr_t) addr & ((sizeof (uint64_t) * 4) - 1)) == 0) + { + int skipped = 0; + while (count >= sizeof (uint64_t) * 4) + { + int i; + for (i = 0; i < sizeof (uint64_t) * 4; i ++) + if (addr[i] != 0) + break; + + if (i == sizeof (uint64_t) * 4) + { + skipped ++; + addr += i; + count -= i; + } + else + break; + } + + if (skipped) + printf ("... skipping %d zero bytes...", + skipped * (int) sizeof (uint64_t) * 4); + + if (count > 0) + { + if (sizeof (uintptr_t) == 8) + printf ("\n%016"PRIxPTR": ", (uintptr_t) addr); + else + printf ("\n%08"PRIxPTR": ", (uintptr_t) addr); + } + else + break; + } + + do + { + printf ("%02x", *addr); + addr ++; + count --; + } + while ((((uintptr_t) addr & (sizeof (uint64_t) - 1)) != 0) + && count > 0); + + printf (" "); } printf ("\n"); } |