Linux内核文本符号

时间:2012-03-16 00:32:36

标签: gdb linux-kernel

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

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

where

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

1 个答案:

答案 0 :(得分:0)

看起来OOPS是因为你跳进了一个不是功能的地方 这很容易导致崩溃,也会阻止调试器将地址解析为符号。

您可以通过拆卸此EIP周围的区域来检查。如果我是正确的,它将作为机器代码没有意义。

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