有时我们得到了某个结构体的地址,这个结构体内部有一个指向另外一个数据结构的指针,那么如何快速输出另外一个数据的内容。
这里有两种方法,还是以task_struct为例,我想输出mm成员的内容:
方法1
根据结构体的地址输出指针成员的值,然后再进行二次引用
crash> *task_struct.mm ffff893e3846e000 mm = 0xffff893cb80fd000, crash> *mm_struct -x 0xffff893cb80fd000 struct mm_struct { { mmap = 0xffff893cb8efbed0, mm_rb = { rb_node = 0xffff893cb8efa4a8 }, vmacache_seqnum = 0x10, get_unmapped_area = 0xffffffff8102ac20 <arch_get_unmapped_area_topdown>, mmap_base = 0x7f0f6a696000, mmap_legacy_base = 0x2b973fb15000, mmap_compat_base = 0xf7f65000, mmap_compat_legacy_base = 0x555ee000, task_size = 0x7ffffffff000, highest_vm_end = 0x7ffd5fff5000, pgd = 0xffff893cb9a86000, ...
方法2
- 如果知道task_struct的地址
crash> *task_struct.mm ffff893e3846e000 -p struct mm_struct *mm = 0xffff893cb80fd000 -> { { mmap = 0xffff893cb8efbed0, mm_rb = { rb_node = 0xffff893cb8efa4a8 }, vmacache_seqnum = 16, get_unmapped_area = 0xffffffff8102ac20 <arch_get_unmapped_area_topdown>, mmap_base = 139704186527744, mmap_legacy_base = 47928608641024, mmap_compat_base = 4160114688, mmap_compat_legacy_base = 1432281088, task_size = 140737488351232, highest_vm_end = 140726214021120, pgd = 0xffff893cb9a86000, ...
- 如果知道task_struct的on_rq成员的地址
crash> *task_struct.comm,mm -p -l task_struct.on_rq 0xffff893e3846e060 comm = "sh\000entry.sh\000]\000\000", struct mm_struct *mm = 0xffff893cb80fd000 -> { { mmap = 0xffff893cb8efbed0, mm_rb = { rb_node = 0xffff893cb8efa4a8 }, vmacache_seqnum = 16, get_unmapped_area = 0xffffffff8102ac20 <arch_get_unmapped_area_topdown>, mmap_base = 139704186527744, mmap_legacy_base = 47928608641024, mmap_compat_base = 4160114688, mmap_compat_legacy_base = 1432281088, task_size = 140737488351232, highest_vm_end = 140726214021120, ... C 复制 全屏
总结
如果我们想查看某个结构体的详细内容,那么可以加上-p
参数,这样可以看到更多的内容,便于问题分析。