2010-10-01 12 views
1

我有一个带调用堆栈的寡妇崩溃转储,显示导致崩溃的函数的模块!函数名+偏移量。该模块内置,无调试信息使用gcc。从非调试内置模块追踪崩溃的源代码行

崩溃的原因是由一种异常未能在给定的地址写的,即访问冲突(05),写冲突(01)

在我的机器我可以访问相同的模块用调试信息构建。我正在寻找的是一种通过使用模块!函数名+偏移量信息作为起点追踪导致崩溃的相应源代码行的方法。

调用堆栈顶部框架的方法名是一个类的析构 错位的函数名_ZN20ViewErrorDescriptionD0Ev + X79

objdump察看了模块-d搜索functionname +偏移给出:

.... call *%eax 
.... mov 0xffffffbc(%ebp), %eax 
.... cmpl 0x0, 0x148(%eax) 

试图找到这在调试内置文件没有给出匹配

析构函数的源代码只包含两个删除婆interX电话。

用gdb加载调试内置模块(sharedlibrary),然后调用信息行给了我一个起始和结束地址,使用的objdump的输出的grep显示相应的反汇编代码,它看起来非常像从一个该模块没有调试信息,但仍相差甚远。

NB! - 从信息输出行说_ZN20ViewErrorDescriptionD2Ev没有_ZN20ViewErrorDescriptionD0Ev作为崩溃转储说。

来自ABI文档摘自: :: = D1#完整对象的析构 :: = D2#基础对象的析构

我在哪里何去何从?

问候 的Kristofer^h

回答

0

这工作,前提是GCC编译是100%确定。我不确定这个假设的有效性。但是,进一步假设你仍然有完全相同的源代码,你可以尝试启用gcc的-S命令行选项并重建。这将产生一组.s文件,每个源文件一个,包含汇编代码。然后,您可以通过此搜索来查找您想要查找的代码机器代码。

1

不幸的是,即使调试/非调试版本可能有不同的地址布局。我知道完成这样的事情的唯一方法是使用调试符号构建并保存该二进制文件的副本。然后,您可以部署一个不带调试信息的ped版本。

您的方法试图找到汇编代码似乎是最有希望的。即使如此,我仍然会扩展它:尝试查看崩溃文件中的大部分程序集,并查看是否可以自己生成更多上下文,而不是让计算机尝试匹配实际上可能略有不同的低级指令。

+0

我一直在这样做很长一段时间,现在我有一个实用的例子,thx。 – Kristofer 2010-12-17 11:30:31