【问题标题】:How does addr2line work with virtual addresses for kernel space debugging?addr2line 如何使用虚拟地址进行内核空间调试?
【发布时间】:2020-11-04 01:46:43
【问题描述】:

我正在尝试使用 addr2line 将“pc”寄存器值从内核 oops (example) 转换为内核代码中的一行。我相信程序计数器的值代表一个虚拟地址。

现在this Stack Overflow 上的帖子说我们通常提供 addr2line 的偏移量而不是虚拟地址。 VA 只能在地址空间随机化关闭时使用。这对内核也适用吗?我认为应该。

幻灯片 14 上的This Embedded Linux Conference talk 也利用程序计数器值跳转到代码行,但我相信这只有在地址空间随机化关闭时才有效。否则,一旦虚拟内存被初始化,内核可能会被随机重定位。在这种情况下,从 oops 中选择的任何虚拟地址对 addr2line 都没有任何意义。这都是理论。我现在有 2 个问题:

  1. 我的理解正确吗?如果不是,请纠正我。
  2. 我们如何关闭内核的地址空间随机化,以便可以预测符号的位置?

【问题讨论】:

标签: c debugging linux-kernel gdb kgdb


【解决方案1】:

是的,你的理解是正确的。

您有多种选择:

  1. 通过使用CONFIG_RANDOMIZE_BASE=n Drastic 解决方案构建内核来完全删除 KASLR 支持,如果不是出于开发目的,不推荐。
  2. 使用命令行参数nokaslr 引导内核。请参阅here 了解更多信息。
  3. 手动计算地址从内核.text 段开始的偏移量。没那么容易,需要事先知道基地址或从恐慌信息中推断出它。使用grep + objdump + 更多 ELF 工具绝对可行,但非常烦人且耗时。

注意:当然,第 1 点和第 2 点要求使用调试符号编译内核以供addr2line 完成其工作。

另请参阅:this Linux kernel doc page

【讨论】:

  • 从内核版本 4.8 开始,内核源代码树中有一个脚本:scripts/faddr2line。与 addr2line 不同,它可以翻译 KASLR 地址。用法: $ ./scripts/faddr2line ~/k/vmlinux meminfo_proc_show+0x5/0x568 。查看脚本并尝试一下..
猜你喜欢
  • 1970-01-01
  • 2019-07-03
  • 2016-06-02
  • 1970-01-01
  • 2023-03-17
  • 2011-12-27
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多