Fixed formatting of output in some debugger commands.

Currently all debugger commands assume 32-bit pointers when formatting their
output. This means that on x86_64 the output is incorrectly formatted. Fixed
this by adding a B_PRINTF_POINTER_WIDTH definition (16 on 64-bit, 8 on
32-bit), and using this to correctly format the output. Not all commands have
been fixed yet, but all VM, slab, VFS, team, thread and image commands should
be correct.
This commit is contained in:
Alex Smith
2012-07-12 11:29:33 +01:00
parent 76a1175dbe
commit c3f0fd28cd
11 changed files with 64 additions and 37 deletions
+8
View File
@@ -148,6 +148,14 @@ typedef generic_addr_t generic_size_t;
#define B_PRIiTIME B_PRIi32
/* Printed width of a pointer with the %p format (minus 0x prefix). */
#ifdef B_HAIKU_64_BIT
# define B_PRINTF_POINTER_WIDTH 16
#else
# define B_PRINTF_POINTER_WIDTH 8
#endif
/* Empty string ("") */
#ifdef __cplusplus
extern const char *B_EMPTY_STRING;
+3 -3
View File
@@ -463,8 +463,8 @@ dump_symbols(int argc, char **argv)
// dump symbols
kprintf("Symbols of image %" B_PRId32 "\"%s\":\n"
"Address Type Size Name\n", image->id, image->name);
kprintf("Symbols of image %" B_PRId32 "\"%s\":\n", image->id, image->name);
kprintf("%-*s Type Size Name\n", B_PRINTF_POINTER_WIDTH, "Address");
if (image->num_debug_symbols > 0) {
// search extended debug symbol table (contains static symbols)
@@ -475,7 +475,7 @@ dump_symbols(int argc, char **argv)
>= image->text_region.size + image->data_region.size)
continue;
kprintf("%08lx %s/%s %5ld %s\n",
kprintf("%0*lx %s/%s %5ld %s\n", B_PRINTF_POINTER_WIDTH,
symbol->st_value + image->text_region.delta,
get_symbol_type_string(symbol), get_symbol_bind_string(symbol),
symbol->st_size, image->debug_string_table + symbol->st_name);
+12 -7
View File
@@ -3174,7 +3174,9 @@ dump_mounts(int argc, char** argv)
return 0;
}
kprintf("address id root covers cookie fs_name\n");
kprintf("%-*s id %-*s %-*s %-*s fs_name\n",
B_PRINTF_POINTER_WIDTH, "address", B_PRINTF_POINTER_WIDTH, "root",
B_PRINTF_POINTER_WIDTH, "covers", B_PRINTF_POINTER_WIDTH, "cookie");
struct hash_iterator iterator;
struct fs_mount* mount;
@@ -3257,8 +3259,9 @@ dump_vnodes(int argc, char** argv)
struct hash_iterator iterator;
struct vnode* vnode;
kprintf("address dev inode ref cache fs-node locking "
"flags\n");
kprintf("%-*s dev inode ref %-*s %-*s %-*s flags\n",
B_PRINTF_POINTER_WIDTH, "address", B_PRINTF_POINTER_WIDTH, "cache",
B_PRINTF_POINTER_WIDTH, "fs-node", B_PRINTF_POINTER_WIDTH, "locking");
hash_open(sVnodeTable, &iterator);
while ((vnode = (struct vnode*)hash_next(sVnodeTable, &iterator)) != NULL) {
@@ -3293,7 +3296,8 @@ dump_vnode_caches(int argc, char** argv)
if (argc > 1)
device = parse_expression(argv[1]);
kprintf("address dev inode cache size pages\n");
kprintf("%-*s dev inode %-*s size pages\n",
B_PRINTF_POINTER_WIDTH, "address", B_PRINTF_POINTER_WIDTH, "cache");
hash_open(sVnodeTable, &iterator);
while ((vnode = (struct vnode*)hash_next(sVnodeTable, &iterator)) != NULL) {
@@ -3344,9 +3348,10 @@ dump_io_context(int argc, char** argv)
kprintf(" used fds:\t%" B_PRIu32 "\n", context->num_used_fds);
kprintf(" max fds:\t%" B_PRIu32 "\n", context->table_size);
if (context->num_used_fds)
kprintf(" no. type ops ref open mode pos"
" cookie\n");
if (context->num_used_fds) {
kprintf(" no. type %*s ref open mode pos %*s\n",
B_PRINTF_POINTER_WIDTH, "ops", B_PRINTF_POINTER_WIDTH, "cookie");
}
for (uint32 i = 0; i < context->table_size; i++) {
struct file_descriptor* fd = context->fds[i];
+2 -1
View File
@@ -261,7 +261,8 @@ dump_images_list(int argc, char **argv)
team = thread_get_current_thread()->team;
kprintf("Registered images of team %" B_PRId32 "\n", team->id);
kprintf(" ID text size data size name\n");
kprintf(" ID %-*s size %-*s size name\n",
B_PRINTF_POINTER_WIDTH, "text", B_PRINTF_POINTER_WIDTH, "data");
while ((image = (struct image*)list_get_next_item(&team->image_list, image))
!= NULL) {
+2 -1
View File
@@ -153,7 +153,8 @@ dump_sem_list(int argc, char** argv)
} else if (argc > 1)
owner = strtoul(argv[1], NULL, 0);
kprintf("sem id count team last name\n");
kprintf("%-*s id count team last name\n", B_PRINTF_POINTER_WIDTH,
"sem");
for (i = 0; i < sMaxSems; i++) {
struct sem_entry* sem = &sSems[i];
+6 -4
View File
@@ -1766,7 +1766,8 @@ MemoryManager::_CheckMetaChunk(MetaChunk* metaChunk)
/*static*/ int
MemoryManager::_DumpRawAllocations(int argc, char** argv)
{
kprintf("area meta chunk chunk base size (KB)\n");
kprintf("%-*s meta chunk chunk %-*s size (KB)\n",
B_PRINTF_POINTER_WIDTH, "area", B_PRINTF_POINTER_WIDTH, "base");
size_t totalSize = 0;
@@ -1798,8 +1799,8 @@ MemoryManager::_DumpRawAllocations(int argc, char** argv)
}
}
kprintf("total: %9" B_PRIuSIZE "\n",
totalSize / 1024);
kprintf("total:%*s%9" B_PRIuSIZE "\n", (2 * B_PRINTF_POINTER_WIDTH) + 21,
"", totalSize / 1024);
return 0;
}
@@ -1976,7 +1977,8 @@ MemoryManager::_DumpArea(int argc, char** argv)
/*static*/ int
MemoryManager::_DumpAreas(int argc, char** argv)
{
kprintf(" base area meta small medium large\n");
kprintf(" %*s %*s meta small medium large\n",
B_PRINTF_POINTER_WIDTH, "base", B_PRINTF_POINTER_WIDTH, "area");
size_t totalTotalSmall = 0;
size_t totalUsedSmall = 0;
+5 -3
View File
@@ -258,8 +258,9 @@ dump_slab(::slab* slab)
static int
dump_slabs(int argc, char* argv[])
{
kprintf("%10s %22s %8s %8s %8s %6s %8s %8s %8s\n", "address", "name",
"objsize", "align", "usage", "empty", "usedobj", "total", "flags");
kprintf("%*s %22s %8s %8s %8s %6s %8s %8s %8s\n",
B_PRINTF_POINTER_WIDTH + 2, "address", "name", "objsize", "align",
"usage", "empty", "usedobj", "total", "flags");
ObjectCacheList::Iterator it = sObjectCaches.GetIterator();
@@ -303,7 +304,8 @@ dump_cache_info(int argc, char* argv[])
kprintf("resize entry don't wait: %p\n", cache->resize_entry_dont_wait);
kprintf("resize entry can wait: %p\n", cache->resize_entry_can_wait);
kprintf(" slab chunk size used offset free\n");
kprintf(" %-*s %-*s size used offset free\n",
B_PRINTF_POINTER_WIDTH, "slab", B_PRINTF_POINTER_WIDTH, "chunk");
SlabList::Iterator iterator = cache->empty.GetIterator();
if (iterator.HasNext())
+2 -1
View File
@@ -1185,7 +1185,8 @@ dump_team_info(int argc, char** argv)
static int
dump_teams(int argc, char** argv)
{
kprintf("team id parent name\n");
kprintf("%-*s id %-*s name\n", B_PRINTF_POINTER_WIDTH, "team",
B_PRINTF_POINTER_WIDTH, "parent");
for (TeamTable::Iterator it = sTeamHash.GetIterator();
Team* team = it.Next();) {
+17 -13
View File
@@ -1595,8 +1595,10 @@ state_to_text(Thread *thread, int32 state)
static void
print_thread_list_table_head()
{
kprintf("thread id state wait for object cpu pri stack "
" team name\n");
kprintf("%-*s id state wait for %-*s cpu pri %-*s team "
"name\n",
B_PRINTF_POINTER_WIDTH, "thread", B_PRINTF_POINTER_WIDTH, "object",
B_PRINTF_POINTER_WIDTH, "stack");
}
@@ -1614,42 +1616,44 @@ _dump_thread_info(Thread *thread, bool shortInfo)
{
sem_id sem = (sem_id)(addr_t)thread->wait.object;
if (sem == thread->msg.read_sem)
kprintf(" ");
else
kprintf("sem %12" B_PRId32 " ", sem);
kprintf("%*s", B_PRINTF_POINTER_WIDTH + 15, "");
else {
kprintf("sem %-*" B_PRId32,
B_PRINTF_POINTER_WIDTH + 5, sem);
}
break;
}
case THREAD_BLOCK_TYPE_CONDITION_VARIABLE:
kprintf("cvar %p ", thread->wait.object);
kprintf("cvar %p ", thread->wait.object);
break;
case THREAD_BLOCK_TYPE_SNOOZE:
kprintf(" ");
kprintf("%*s", B_PRINTF_POINTER_WIDTH + 15, "");
break;
case THREAD_BLOCK_TYPE_SIGNAL:
kprintf("signal ");
kprintf("signal%*s", B_PRINTF_POINTER_WIDTH + 9, "");
break;
case THREAD_BLOCK_TYPE_MUTEX:
kprintf("mutex %p ", thread->wait.object);
kprintf("mutex %p ", thread->wait.object);
break;
case THREAD_BLOCK_TYPE_RW_LOCK:
kprintf("rwlock %p ", thread->wait.object);
kprintf("rwlock %p ", thread->wait.object);
break;
case THREAD_BLOCK_TYPE_OTHER:
kprintf("other ");
kprintf("other%*s", B_PRINTF_POINTER_WIDTH + 10, "");
break;
default:
kprintf("??? %p ", thread->wait.object);
kprintf("??? %p ", thread->wait.object);
break;
}
} else
kprintf(" - ");
kprintf("-%*s", B_PRINTF_POINTER_WIDTH + 14, "");
// on which CPU does it run?
if (thread->cpu)
+3 -2
View File
@@ -344,8 +344,9 @@ VMAddressSpace::_DumpCommand(int argc, char** argv)
/*static*/ int
VMAddressSpace::_DumpListCommand(int argc, char** argv)
{
kprintf(" address id base end area count "
" area size\n");
kprintf(" %*s id %*s %*s area count area size\n",
B_PRINTF_POINTER_WIDTH, "address", B_PRINTF_POINTER_WIDTH, "base",
B_PRINTF_POINTER_WIDTH, "end");
AddressSpaceTable::Iterator it = sAddressSpaceTable.GetIterator();
while (VMAddressSpace* space = it.Next()) {
+4 -2
View File
@@ -3372,7 +3372,9 @@ dump_area_list(int argc, char** argv)
name = argv[1];
}
kprintf("addr id base\t\tsize protect lock name\n");
kprintf("%-*s id %-*s %-*sprotect lock name\n",
B_PRINTF_POINTER_WIDTH, "addr", B_PRINTF_POINTER_WIDTH, "base",
B_PRINTF_POINTER_WIDTH, "size");
VMAreaHashTable::Iterator it = VMAreaHash::GetIterator();
while ((area = it.Next()) != NULL) {
@@ -3380,7 +3382,7 @@ dump_area_list(int argc, char** argv)
|| (name != NULL && strstr(area->name, name) == NULL))
continue;
kprintf("%p %5" B_PRIx32 " %p\t%p %4" B_PRIx32 "\t%4d %s\n", area,
kprintf("%p %5" B_PRIx32 " %p %p %4" B_PRIx32 " %4d %s\n", area,
area->id, (void*)area->Base(), (void*)area->Size(),
area->protection, area->wiring, area->name);
}