我在XCode 4中调试C++项目中的分段错误时遇到了很多问题。
当我使用“LLVM2.0”编译器选项进行编译并使用-O3优化时,我只得到一个段错误。据我所知,当使用优化时,调试选项有限,但以下是我在打开gdb的情况下在Xcode中运行后得到的调试输出:
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";,段错误就会消失。其他的print语句会导致我的程序在其主循环的不同迭代中出现segfault。自然地,当我输入足够多的print语句来精确定位违规代码时,segfault似乎发生在一行之后但在下一行之前(也就是说没有发生)。
我使用指针和动态内存分配,这可能是问题的原因,但由于我不能缩小导致错误的代码块,所以我不知道在这里显示哪些代码。
我尝试使用Instruments中的" leaks“工具进行分析,但它没有发现任何泄漏。
有什么建议吗?我对调试非常缺乏经验,所以任何东西都会有帮助,真的。
编辑:已解决。在给定某些输入的情况下,我的程序将尝试读取超过数组末尾的内容。
发布于 2011-06-13 09:20:34
我不认为有足够的信息可以帮助你解决矮人的问题。我对这个工具链还不够熟悉,不知道它有多健壮。
然而,您的崩溃症状闻起来很像堆损坏。我不知道默认情况下OSX使用什么分配器,但常见的优化将元数据内联存储在对象中,和/或通过空对象线程化freelist,这使得它们对堆上的缓冲区溢出非常敏感。释放对象两次或使用悬空指针(已释放的指针,但其空间现在可能正由另一个分配使用)也可能导致看起来不确定且难以跟踪错误,因为堆的布局很可能在两次运行之间发生变化。打印语句也使用分配器,这意味着更改打印语句可以更改问题出现的时间和位置。
我的导师(http://prisms.cs.umass.edu/emery/index.php?page=download-diehard)提供了一个称为DieHard的堆替换工具,它可以帮助您确定这是一个堆问题还是什么无关的问题。我相信它将构建在OSX上,你可以使用LD_PRELOAD=/path/to/libdiehard.so将它链接到你的程序中,在运行时替换默认的分配器。它的唯一目的是抵抗内存错误和堆损坏,所以如果您的应用程序实际使用它运行,您可能需要查看它。
https://stackoverflow.com/questions/6325661
复制相似问题