版权声明:本文为博主原创文章,未经博主允许不得转载。 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,与堆栈中的绝对地址相同。