矮人错误:找不到DIE

问题描述

| 我在XCode 4的C ++项目中调试分段错误时遇到很多麻烦。 当我使用\“ LLVM 2.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崩溃了(自从我开始使用它以来,这就是一个常见的主题)。 我的程序是确定性的,但是当我尝试使用打印语句隔离问题时,行为将会改变。例如,如果我在某一点加上“ 1”,则分段错误消失。其他打印语句导致我的程序在其主循环的不同迭代中出现段错误。而且自然而然地,当我输入足够多的打印语句来精确定位有问题的代码时,该段错误似乎发生在一行之后但在下一行之前(即无处)。 我正在使用指针和动态内存分配,这很可能是问题的原因,但是由于我无法缩小导致错误代码块的范围,因此我不知道在这里显示什么代码。 我尝试使用Instruments中的“泄漏”工具进行性能分析,但未发现任何泄漏。 有什么建议吗?我对调试非常缺乏经验,所以确实可以帮上任何忙。 编辑:解决。给定某些输入,我的程序将尝试读取数组末尾的内容。     

解决方法

        我认为没有足够的信息可以帮助您解决DWARF问题。我对该工具链还不够熟悉,无法知道它的健壮性。 但是,您崩溃的症状闻起来很像堆损坏。我不知道默认情况下OSX使用什么分配器,但是常见的优化是将元数据与对象内联存储和/或将空闲列表通过空对象进行线程存储,这使它们对堆上的缓冲区溢出非常敏感。两次释放对象或使用悬空指针(已释放但其空间现在可能已由另一分配使用的指针)也可能导致看似不确定的且难以跟踪的错误,因为堆的布局可能会在运行。打印语句还使用分配器,这意味着更改打印语句可以在问题出现的时间和地点进行更改。 您的工具可能有助于确定这是堆问题还是无关的东西,是我的顾问称为DieHard的堆替换(http://prisms.cs.umass.edu/emery/index.php?page=download-死硬死硬的顽固的)。我相信它将在OSX上构建,并且您可以使用
LD_PRELOAD=/path/to/libdiehard.so
将其链接到程序中,以在运行时替换默认分配器。其唯一目的是抵抗内存错误和堆损坏,因此,如果您的应用程序实际与之一起运行,则可能是您需要查找的地方。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...