【问题标题】:Linux Kernel Text SymbolsLinux 内核文本符号
【发布时间】:2012-03-18 20:38:24
【问题描述】:

当我查看 linux 内核 OOPS 输出时,EIP 和其他代码地址的值在 0xC01----- 范围内。在我的 System.map 和objdump -S vmlinux 输出中,所有的代码地址至少都在 0xC1 以上------。我的 vmlinux 包含调试符号 (CONFIG_DEBUG_INFO)。

当我通过串行连接 (kgdb) 进行调试并使用 gdb ./vmlinux 加载 gdb 时,我又遇到了同样的问题,即我无法将 $eip 与 System.map 和 objdump 输出中的内容协调一致。当我在 gdb 中运行 where 时,堆栈上会出现混乱:

#0 0xC01----- in ?? ()
#1 0xC01----- in ?? ()
#2 0xC01----- in ?? ()
...

任何人都可以就如何解决这个/这些问题提出任何建议吗?我主要关心的是我如何将 OOPS 中的 eip 值实际映射到 System.map 或 objdump -S vmlinux。我知道 OOPS 会给我函数名和目标代码的偏移量,但我更关心前面提到的问题以及为什么 gdb 无法正确显示堆栈回溯。

【问题讨论】:

    标签: gdb linux-kernel


    【解决方案1】:

    看起来 OOPS 是因为您跳入了一个不是函数的地方。
    这很容易导致崩溃,并且还会阻止调试器将地址解析为符号。

    您可以通过分解此 EIP 周围的区域来检查这一点。如果我是正确的,它作为机器码就没有意义。

    这种情况一般有两个原因:
    1. 使用损坏的函数指针进行函数调用。在这种情况下,最后一个之前的堆栈帧应该显示调用者。但是你没有这个框架,所以可能是另一个原因。 2. 堆栈溢出 - 您的返回地址已损坏,因此您返回了错误的位置。如果是这样,ESP 指向的数据应该包含 EIP 中的地址。调试堆栈溢出很困难,因为缺少最重要的信息来源。您可以尝试以“原始”格式 (x/xa addr) 打印堆栈,并尝试理解它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2017-07-20
      • 1970-01-01
      • 2016-01-13
      相关资源
      最近更新 更多