2011-06-13 85 views
4

我有很多的麻烦在C调试分割故障的XCode ++项目4矮人错误:无法找到DIE

我只得到一个段错误,当我用“LLVM 2.0”编译器选项和使用内置-O3优化。据我了解,有一个时使用的优​​化有限的调试选项,但这里是调试输出我拿到后,我在Xcode中运行使用gdb开启:

warning: Got an error handling event: "Dwarf Error: Cannot find DIE at 0x3be2 referenced from DIE at 0x11d [in module /Users/imran/Library/Developer/Xcode/DerivedData/cgo-hczcifktgscxjigfphieegbpxxsq/Build/Products/Debug/cgo]". 
No memory available to program now: unsafe to call malloc 

我不能让gdb来给我之后的任何有用的信息(如跟踪),但我不知道我真的知道如何正确使用它。当我尝试使用“LLDB”调试器时Xcode刚刚崩溃(自从我开始使用它以来,这已经是一个常见的主题)。

我的程序是确定性的,但是当我尝试用print语句隔离问题时,行为会发生改变。例如,如果我在一点处添加cout << "hello";,则段错误消失。其他打印语句会导致我的程序在其主循环的不同迭代中发生段错误。当然,当我输入足够的打印语句来查明有问题的代码时,段错误似乎发生在一行之后但在下一行之前(即无处)。

我正在使用指针和动态内存分配,这可能是问题的原因,但由于我无法缩小导致错误的代码块,因此我不知道要在此处显示哪些代码。

我尝试使用乐器中的“泄漏”工具进行分析,但没有发现任何泄漏。

有什么建议吗?我对调试很缺乏经验,所以任何事情都会有所帮助。

编辑:解决。考虑到某些输入,我的程序会尝试读取数组的末尾。

回答

2

我不认为有足够的信息可以帮助您解决DWARF问题。我对这个工具链不够熟悉,不知道它有多强大。

然而,您的崩溃症状闻起来很像堆腐败。我不知道默认情况下OSX使用了什​​么分配器,但通用优化将元数据与对象内联存储在一起,和/或通过空对象将freelist线程化,这使得它们对堆中的缓冲区溢出非常敏感。释放对象两次或使用悬挂指针(已释放但其空间现在可被另一个分配使用的指针)也会导致看起来不确定且难以跟踪的错误,因为堆的布局可能会在运行。打印语句也使用分配器,这意味着更改打印语句可以改变问题出现的时间和地点。

您可能会发现有助于确定这是堆问题还是不相关的工具是由我的顾问(http://prisms.cs.umass.edu/emery/index.php?page=download-diehard)称为DieHard的堆替换。我相信它将建立在OSX之上,并且您可以使用LD_PRELOAD=/path/to/libdiehard.so将其链接到您的程序,以在运行时替换默认的分配器。它的唯一目的是抵制内存错误和堆损坏,所以如果你的应用程序真的与它一起运行,那可能就是你需要查看的地方。

+0

感谢您的信息和链接到DieHard。我不认为我有两次释放任何东西,但有很多地方我可以有一个晃来晃去的指针。我会尝试更仔细地寻找这种类型的错误。 – Imran 2011-06-13 01:33:40