* Added new KDL command "string" that dumps a string given a pointer.

* Use parse_expression() where appropriate.
* Removed extraneous white space.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24593 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-03-26 16:21:33 +00:00
parent 5dafcc2b1b
commit c32f787401
+87 -57
View File
@@ -2684,19 +2684,21 @@ display_mem(int argc, char **argv)
}
if (argc < i + 1 || argc > i + 2) {
kprintf("usage: dl/dw/ds/db [-p|--physical] <address> [num]\n"
kprintf("usage: dl/dw/ds/db/string [-p|--physical] <address> [num]\n"
"\tdl - 8 bytes\n"
"\tdw - 4 bytes\n"
"\tds - 2 bytes\n"
"\tdb - 1 byte\n"
" -p or --physical only allows memory from a single page to be displayed.\n");
"\tstring - a whole string\n"
" -p or --physical only allows memory from a single page to be "
"displayed.\n");
return 0;
}
address = strtoul(argv[i], NULL, 0);
address = parse_expression(argv[i]);
if (argc > i + 1)
num = atoi(argv[i + 1]);
num = parse_expression(argv[i + 1]);
// build the format string
if (strcmp(argv[0], "db") == 0) {
@@ -2711,6 +2713,9 @@ display_mem(int argc, char **argv)
} else if (strcmp(argv[0], "dl") == 0) {
itemSize = 8;
displayWidth = 2;
} else if (strcmp(argv[0], "string") == 0) {
itemSize = 1;
displayWidth = -1;
} else {
kprintf("display_mem called in an invalid way!\n");
return 0;
@@ -2743,58 +2748,86 @@ display_mem(int argc, char **argv)
} else
copyAddress = address;
for (i = 0; i < num; i++) {
uint32 value;
if (!strcmp(argv[0], "string")) {
kprintf("%p \"", (char*)copyAddress);
if ((i % displayWidth) == 0) {
int32 displayed = min_c(displayWidth, (num-i)) * itemSize;
if (i != 0)
kprintf("\n");
// string mode
for (i = 0; true; i++) {
char c;
if (user_memcpy(&c, (char*)copyAddress + i, 1) != B_OK
|| c == '\0')
break;
kprintf("[0x%lx] ", address + i * itemSize);
for (j = 0; j < displayed; j++) {
char c;
if (user_memcpy(&c, (char *)copyAddress + i * itemSize + j, 1) != B_OK) {
displayed = j;
break;
}
if (c == '\n')
kprintf("\\n");
else if (c == '\t')
kprintf("\\t");
else {
if (!isprint(c))
c = '.';
kprintf("%c", c);
}
if (num > displayWidth) {
// make sure the spacing in the last line is correct
for (j = displayed; j < displayWidth * itemSize; j++)
kprintf(" ");
}
kprintf("\"\n");
} else {
// number mode
for (i = 0; i < num; i++) {
uint32 value;
if ((i % displayWidth) == 0) {
int32 displayed = min_c(displayWidth, (num-i)) * itemSize;
if (i != 0)
kprintf("\n");
kprintf("[0x%lx] ", address + i * itemSize);
for (j = 0; j < displayed; j++) {
char c;
if (user_memcpy(&c, (char*)copyAddress + i * itemSize + j,
1) != B_OK) {
displayed = j;
break;
}
if (!isprint(c))
c = '.';
kprintf("%c", c);
}
if (num > displayWidth) {
// make sure the spacing in the last line is correct
for (j = displayed; j < displayWidth * itemSize; j++)
kprintf(" ");
}
kprintf(" ");
}
if (user_memcpy(&value, (uint8*)copyAddress + i * itemSize,
itemSize) != B_OK) {
kprintf("read fault");
break;
}
switch (itemSize) {
case 1:
kprintf(" %02x", *(uint8 *)&value);
break;
case 2:
kprintf(" %04x", *(uint16 *)&value);
break;
case 4:
kprintf(" %08lx", *(uint32 *)&value);
break;
case 8:
kprintf(" %016Lx", *(uint64 *)&value);
break;
}
kprintf(" ");
}
if (user_memcpy(&value, (uint8 *)copyAddress + i * itemSize, itemSize) != B_OK) {
kprintf("read fault");
break;
}
switch (itemSize) {
case 1:
kprintf(" %02x", *(uint8 *)&value);
break;
case 2:
kprintf(" %04x", *(uint16 *)&value);
break;
case 4:
kprintf(" %08lx", *(uint32 *)&value);
break;
case 8:
kprintf(" %016Lx", *(uint64 *)&value);
break;
}
kprintf("\n");
}
kprintf("\n");
if (physical) {
copyAddress = ROUNDOWN(copyAddress, B_PAGE_SIZE);
kernel_startup = true;
@@ -2829,14 +2862,12 @@ dump_cache_tree_recursively(vm_cache* cache, int level,
static int
dump_cache_tree(int argc, char **argv)
{
if (argc < 2 || strlen(argv[1]) < 2
|| argv[1][0] != '0'
|| argv[1][1] != 'x') {
kprintf("%s: invalid argument, pass address\n", argv[0]);
if (argc != 2 || !strcmp(argv[1], "--help")) {
kprintf("usage: %s <address>\n", argv[0]);
return 0;
}
addr_t address = strtoul(argv[1], NULL, 0);
addr_t address = parse_expression(argv[1]);
if (address == 0)
return 0;
@@ -2900,7 +2931,7 @@ dump_cache(int argc, char **argv)
bool showPages = false;
int i = 1;
if (argc < 2) {
if (argc < 2 || !strcmp(argv[1], "--help")) {
kprintf("usage: %s [-ps] <address>\n"
" if -p is specified, all pages are shown, if -s is used\n"
" only the cache info is shown respectively.\n", argv[0]);
@@ -2915,14 +2946,12 @@ dump_cache(int argc, char **argv)
}
i++;
}
if (argv[i] == NULL || strlen(argv[i]) < 2
|| argv[i][0] != '0'
|| argv[i][1] != 'x') {
if (argv[i] == NULL) {
kprintf("%s: invalid argument, pass address\n", argv[0]);
return 0;
}
addr_t address = strtoul(argv[i], NULL, 0);
addr_t address = parse_expression(argv[i]);
if (address == 0)
return 0;
@@ -3024,7 +3053,7 @@ dump_area(int argc, char **argv)
vm_area *area;
addr_t num;
if (argc < 2) {
if (argc < 2 || !strcmp(argv[1], "--help")) {
kprintf("usage: area [-m] <id|address|name>\n");
return 0;
}
@@ -3034,7 +3063,7 @@ dump_area(int argc, char **argv)
index++;
}
num = strtoul(argv[index], NULL, 0);
num = parse_expression(argv[index]);
// walk through the area list, looking for the arguments as a name
struct hash_iterator iter;
@@ -3065,7 +3094,7 @@ dump_area_list(int argc, char **argv)
int32 id = 0;
if (argc > 1) {
id = strtoul(argv[1], NULL, 0);
id = parse_expression(argv[1]);
if (id == 0)
name = argv[1];
}
@@ -3561,6 +3590,7 @@ vm_init(kernel_args *args)
add_debugger_command("dw", &display_mem, "dump memory words (32-bit)");
add_debugger_command("ds", &display_mem, "dump memory shorts (16-bit)");
add_debugger_command("db", &display_mem, "dump memory bytes (8-bit)");
add_debugger_command("string", &display_mem, "dump strings");
TRACE(("vm_init: exit\n"));