首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dwarf错误:找不到骰子

Dwarf错误:找不到骰子
EN

Stack Overflow用户
提问于 2011-06-13 08:28:42
回答 1查看 3.1K关注 0票数 5

我在XCode 4中调试C++项目中的分段错误时遇到了很多问题。

当我使用“LLVM2.0”编译器选项进行编译并使用-O3优化时,我只得到一个段错误。据我所知,当使用优化时,调试选项有限,但以下是我在打开gdb的情况下在Xcode中运行后得到的调试输出:

代码语言:javascript
复制
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“工具进行分析,但它没有发现任何泄漏。

有什么建议吗?我对调试非常缺乏经验,所以任何东西都会有帮助,真的。

编辑:已解决。在给定某些输入的情况下,我的程序将尝试读取超过数组末尾的内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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将它链接到你的程序中,在运行时替换默认的分配器。它的唯一目的是抵抗内存错误和堆损坏,所以如果您的应用程序实际使用它运行,您可能需要查看它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6325661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档