2012-03-16 140 views
0

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

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

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

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

回答

0

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

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

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