您的位置:首页 > 运维架构 > Linux

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

2017-04-06 16:46 225 查看
有如下kernel堆栈

0.121647:   <6> CPU: 2 PID: 1 Comm: swapper/0 Not tainted 3.18.31-perf-g7b45103 #1
0.121657:   <6> Hardware
4000
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,与堆栈中的绝对地址相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息