【发布时间】:2020-11-04 01:46:43
【问题描述】:
我正在尝试使用 addr2line 将“pc”寄存器值从内核 oops (example) 转换为内核代码中的一行。我相信程序计数器的值代表一个虚拟地址。
现在this Stack Overflow 上的帖子说我们通常提供 addr2line 的偏移量而不是虚拟地址。 VA 只能在地址空间随机化关闭时使用。这对内核也适用吗?我认为应该。
幻灯片 14 上的This Embedded Linux Conference talk 也利用程序计数器值跳转到代码行,但我相信这只有在地址空间随机化关闭时才有效。否则,一旦虚拟内存被初始化,内核可能会被随机重定位。在这种情况下,从 oops 中选择的任何虚拟地址对 addr2line 都没有任何意义。这都是理论。我现在有 2 个问题:
- 我的理解正确吗?如果不是,请纠正我。
- 我们如何关闭内核的地址空间随机化,以便可以预测符号的位置?
【问题讨论】:
-
我想从内核文档中添加这个链接:kernel.org/doc/html/v5.8-rc5/admin-guide/bug-hunting.html。这回答并加强了上面提到的一些观点。希望这对未来的访客有所帮助。
标签: c debugging linux-kernel gdb kgdb