c – 矮人错误:找不到DIE

我在XCode 4中调试C项目中的分段错误时遇到了很多麻烦.

当我使用“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<< “你好”;在某一点上,段错误消失了.其他打印语句导致我的程序在其主循环的不同迭代中进行段错误.当我输入足够的打印语句以便查明有问题的代码时,自然会出现段错误,但是在一行之后但在下一行之前(即无处). 我正在使用指针和动态内存分配,这可能是问题的原因,但由于我无法缩小导致错误的代码块,我不知道在这里显示什么代码. 我尝试使用Instruments中的“Leaks”工具进行分析,但没有发现任何泄漏. 有什么建议?我对调试非常缺乏经验,所以任何事情都会有所帮助. 编辑:解决了.给定某些输入,我的程序将尝试读取数组的末尾.

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

然而,你的崩溃症状就像堆腐败一样.我不知道默认情况下分配器OSX使用什么,但是常见的优化存储元数据与对象内联和/或通过空对象线程化空闲列表,这使得它们对堆上的缓冲区溢出非常敏感.释放一个对象两次或使用悬空指针(一个已被释放但其空间现在可能被另一个分配使用的指针)也会导致看似不确定且难以跟踪错误,因为堆的布局可能会在两者之间发生变化.运行. Print语句也使用allocator,这意味着更改print语句可以在问题出现的时间和地点发生变化.

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

点赞