linux kernel通过堆栈地址查询对应源代码的行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l460133921/article/details/69396670

有如下kernel堆栈

     0.121647:   <6> CPU: 2 PID: 1 Comm: swapper/0 Not tainted 3.18.31-perf-g7b45103 #1
     0.121657:   <6> Hardware name: Qualcomm Technologies, Inc. MSM8940-PMI8950 MTP (DT)
     0.121667:   <6> Call trace:
     0.121682:   <2> [<ffffffc000089ba8>] dump_backtrace+0x0/0x23c
     0.121696:   <2> [<ffffffc000089df8>] show_stack+0x14/0x1c
     0.121711:   <2> [<ffffffc000d27dbc>] dump_stack+0x80/0xa4
     0.121727:   <2> [<ffffffc0000a2f34>] warn_slowpath_common+0x8c/0xb0
     0.121741:   <2> [<ffffffc0000a3070>] warn_slowpath_null+0x18/0x20
     0.121754:   <2> [<ffffffc00148e5c8>] msm_pm_boot_init+0x90/0xd0
     0.121767:   <2> [<ffffffc000082ae4>] do_one_initcall+0x18c/0x1a8
     0.121781:   <2> [<ffffffc00144bcdc>] kernel_init_freeable+0x318/0x3c4
     0.121796:   <2> [<ffffffc000d20910>] kernel_init+0x14/0xe4
     0.121813:   <6> ---[ end trace 2d5d27f65eb33aa7 ]---

现在想通过堆栈地址获得对应源代码的行号,方法如下:

  • 堆栈地址为绝对地址
    方法:addr2line -e vmlinux [地址]
    示例:
    这里写图片描述
  • 只有函数名+偏移地址
    方法:通过“nm vmlinux | grep [函数名]”获得函数的地址,再加上偏移地址,则得到堆栈的绝对地址,然后再用第一种情况获得代码行
    示例:
    这里写图片描述
    可以发现kernel_init_freeable的起始地址为ffffffc00144b9c4,加上其在堆栈中的偏移地址0x318,则得到其绝对地址为ffffffc00144bcdc,与堆栈中的绝对地址相同。

猜你喜欢

转载自blog.csdn.net/l460133921/article/details/69396670