summaryrefslogtreecommitdiff
path: root/viengoos
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-02-19 19:16:14 +0100
committerNeal H. Walfield <neal@gnu.org>2009-02-19 19:16:14 +0100
commitfc9784bcdfd8adaa0d96572466195ef43b993c8b (patch)
tree68802a77dc72085e1d83565abed7d5de388cfa51 /viengoos
parentee4b520e643c9f51fdb51a5267a988a0e50937eb (diff)
Improve memory dump's output.
Diffstat (limited to 'viengoos')
-rw-r--r--viengoos/object.c79
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");
}