crash —— 如何获取结构体成员指向的结构的内容?

发布时间 2023-09-24 21:48:01作者: 摩斯电码

有时我们得到了某个结构体的地址,这个结构体内部有一个指向另外一个数据结构的指针,那么如何快速输出另外一个数据的内容。

这里有两种方法,还是以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,
...