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

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

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

这里有两种方法,还是以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参数,这样可以看到更多的内容,便于问题分析。

相关文章
|
2月前
crash —— 如果知道结构体内部某个成员的地址,如何输出结构体内容?
crash —— 如果知道结构体内部某个成员的地址,如何输出结构体内容?
|
2月前
crash —— 查看数据结构内部成员的偏移量和地址
crash —— 查看数据结构内部成员的偏移量和地址
|
6月前
|
安全
C learning_15 结构体类型的声明、结构体初始化、结构体成员访问、结构体传参
C learning_15 结构体类型的声明、结构体初始化、结构体成员访问、结构体传参
|
6月前
|
存储 安全 编译器
使用unsafe库操作结构体的属性偏移和指针转换
【5月更文挑战第19天】Go语言是类型安全的,但通过`unsafe`包,可以进行结构体属性偏移量计算和指针转换。`unsafe.Offsetof`获取结构体字段的偏移量,`unsafe.Pointer`允许不同类型指针间的转换。然而,这可能导致类型安全屏障被绕过,若使用不当,会引发安全问题或panic。应谨慎使用`unsafe`,因为它不遵循GO 1兼容性准则。
51 0
使用unsafe库操作结构体的属性偏移和指针转换
|
6月前
访问结构成员
【2月更文挑战第9天】访问结构成员。
27 3
|
6月前
结构体类型操作
自定义一个结构体类型的变量,其成员包括学号、姓名、年龄、性别,并将其类型声明为student,然后用该类型定义一个stu1的变量,进行赋值操作,并输出其值。
52 1
|
6月前
|
存储 Java 编译器
C 语言指针完全指南:创建、解除引用、指针与数组关系解析
创建指针 我们可以使用引用运算符 & 获取变量的内存地址:
185 0
|
关系型数据库 MySQL Go
[Golang]存在调用同一个包内某个结构体的方法出错?可能是未初始化结构体
[Golang]存在调用同一个包内某个结构体的方法出错?可能是未初始化结构体
|
存储 Rust JavaScript
Rust:为什么不能在同一个结构体中存储一个值和对该值的引用?(修改版)
基本把下面问题这个搞明白,就能彻底明白 Rust 语言的生命周期是怎么回事了。简而言之,生命周期不会改变你的代码,是你的生命控制生命周期,而不是生命周期在控制你的代码。换言之,生命周期是描述性的,而不是规定性的。
176 0
定义函数,并用指针交换两个变量内容(正确版和错误版+错误原因)
定义函数,并用指针交换两个变量内容(正确版和错误版+错误原因)
91 0
定义函数,并用指针交换两个变量内容(正确版和错误版+错误原因)