Imr*_*ran 5 c++ macos segmentation-fault xcode4
我在调试 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
Run Code Online (Sandbox Code Playgroud)
之后我无法让 gdb 为我提供任何有用的信息(如跟踪),但我不确定我是否真的知道如何正确使用它。当我尝试使用“LLDB”调试器时,Xcode 崩溃了(自从我开始使用它以来,这一直是一个常见的主题)。
我的程序是确定性的,但是当我尝试用打印语句隔离问题时,行为会改变。例如,如果我cout << "hello";在某一点添加段错误就会消失。其他打印语句导致我的程序在其主循环的不同迭代中出现段错误。很自然地,当我输入足够多的打印语句来确定有问题的代码时,段错误似乎发生在一行之后但在下一行之前(即无处)。
我正在使用指针和动态内存分配,这可能是问题的原因,但由于我无法缩小导致错误的代码块的范围,我不知道这里显示什么代码。
我尝试使用 Instruments 中的“泄漏”工具进行分析,但没有发现任何泄漏。
有什么建议吗?我对调试非常缺乏经验,所以任何事情都会有所帮助,真的。
编辑:解决了。给定某些输入,我的程序将尝试读取数组的末尾。
我认为没有足够的信息可以帮助您解决 DWARF 问题。我对该工具链不够熟悉,不知道它有多强大。
然而,你的崩溃症状闻起来很像堆损坏。我不知道 OSX 默认使用什么分配器,但常见的优化存储与对象内联的元数据和/或通过空对象对空闲列表进行线程化,这使得它们对堆上的缓冲区溢出非常敏感。两次释放对象或使用悬空指针(已被释放但其空间现在可能被另一个分配使用的指针)也可能导致看似不确定且难以跟踪的错误,因为堆的布局可能会在运行。打印语句也使用分配器,这意味着更改打印语句可以改变问题出现的时间和地点。
您可能会发现有助于确定这是堆问题还是不相关问题的工具是我的顾问提供的名为 DieHard 的堆替换(http://prisms.cs.umass.edu/emery/index.php?page=download-死硬死硬的顽固的)。我相信它将构建在 OSX 上,并且您可以将其链接到您的程序中,用于LD_PRELOAD=/path/to/libdiehard.so在运行时替换默认分配器。它的唯一目的是防止内存错误和堆损坏,因此如果您的应用程序实际上使用它运行,那么这可能就是您需要查看的地方。