【问题标题】:addr2line on kernel address cannot find source line内核地址上的 addr2line 找不到源代码行
【发布时间】:2018-10-18 22:24:19
【问题描述】:

我正在构建一个启用了调试符号的自定义 linux 内核 (4.15.0 x86_64)。我发现 addr2line 无法指向源代码行。

addr2line -e vmlinux 0xffffffff9be625f0

gdb 还使用以下命令返回“地址没有可用的行号信息”

$ gdb ../linux/vmlinux /proc/kcore

...从../linux/vmlinux...读取符号...完成。

$ 信息行 *0xffffffff9be625f0

应该怎么做才能从地址中获取行号?这是.config 文件。

【问题讨论】:

标签: linux linux-kernel gdb addr2line


【解决方案1】:

首先 - 尝试从 /proc/kallsyms 中找出该地址属于哪个过程。然后从这个过程的开始计算这个地址的偏移量。那么:

objdump -D -S -l ./vmlinux | less

找到您的过程名称,然后移动到您的偏移量。 当然你的内核 vmlinux 应该用调试符号编译。

【讨论】:

  • 我可以理解使用这种方法可以找到机器码。但这不是我的目的。我想找到c文件的那一行,这就是addr2line的目的。
  • 用我的方法你会发现的——我总是用这种方法。第二件事 - 我在我的嵌入式系统上检查了它,模块中的符号也列在 int /proc/kallsyms 中,所以这个地址可能来自模块,而不是来自内核本身,这就是 addr2line 没有显示地址的原因?
  • 由于 KASLR,addr2line 无法属性。禁用 RANDOMIZE_BASE 解决了这个问题。
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2012-12-13
  • 2017-05-16
  • 2014-06-28
相关资源
最近更新 更多