summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-02-23 20:58:59 +0100
committerNeal H. Walfield <neal@gnu.org>2009-02-23 20:58:59 +0100
commitf36fe8af3fe9288386a2d40c1730d353e7f1bef6 (patch)
tree195175656af8573750a625da5277bc5553b1893a
parent4350b0adcaed317d4758379d347d8a431bb6d5ec (diff)
Fix memory dump output.
-rw-r--r--viengoos/object.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/viengoos/object.c b/viengoos/object.c
index 9b187c7..c700784 100644
--- a/viengoos/object.c
+++ b/viengoos/object.c
@@ -197,20 +197,34 @@ memory_debug_command (int argc, char *argv[])
addr -= count;
}
+ int i = (uintptr_t) addr & (sizeof (uint64_t) - 1);
+ if (i != 0)
+ /* ADDR is not a multiple of a uint64_t, round down. */
+ {
+ count += i;
+ addr -= i;
+ }
+
+ i = (uintptr_t) count & (sizeof (uint64_t) - 1);
+ if (i != 0)
+ /* COUNT is not a multiple of a uint64_t, round up. */
+ count += sizeof (uint64_t) - i;
+
if (((uintptr_t) addr & ((sizeof (uint64_t) * 4) - 1)) != 0)
{
if (sizeof (uintptr_t) == 8)
- printf ("%016"PRIxPTR": ", (uintptr_t) addr);
+ printf ("%016"PRIxPTR":", (uintptr_t) addr);
else
- printf ("%08"PRIxPTR": ", (uintptr_t) addr);
+ printf ("%08"PRIxPTR":", (uintptr_t) addr);
- uintptr_t a = ((uintptr_t) addr & ~((sizeof (uint64_t) * 4) - 1));
- while (a < (uintptr_t) addr)
+ uintptr_t a;
+ for (a = ((uintptr_t) addr & ~((sizeof (uint64_t) * 4) - 1));
+ a < (uintptr_t) addr;
+ a ++)
{
- printf (" ");
- a ++;
if ((a & (sizeof (uint64_t) - 1)) == 0)
printf (" ");
+ printf (" ");
}
}
@@ -238,30 +252,23 @@ memory_debug_command (int argc, char *argv[])
}
if (skipped)
- printf ("... skipping %d zero bytes...",
+ printf ("\n... 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);
+ printf ("\n%016"PRIxPTR":", (uintptr_t) addr);
else
- printf ("\n%08"PRIxPTR": ", (uintptr_t) addr);
+ 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 (" %016"PRIxPTR, *(uint64_t *) addr);
+ addr += sizeof (uint64_t);
+ count -= sizeof (uint64_t);
}
printf ("\n");
}
@@ -284,7 +291,6 @@ object_lookup_command (int argc, char *argv[])
}
struct thread *thread = current_thread;
-
if (argc == 3)
{
vg_oid_t oid = strtoul (argv[1], NULL, 16);
@@ -304,6 +310,11 @@ object_lookup_command (int argc, char *argv[])
thread = (struct thread *) object;
}
+ if (! thread)
+ {
+ printf ("current_thread is NULL and no thread specified.");
+ return;
+ }
char *tail = NULL;
uintptr_t prefix = strtoul (argv[argc - 1], &tail, 16);