libc中的错误?如何读取转储文件?

Posted

技术标签:

【中文标题】libc中的错误?如何读取转储文件?【英文标题】:Bug in libc? How to read dump file? 【发布时间】:2012-06-15 11:48:13 【问题描述】:

我会尽量以最好的方式提出我的问题:

我想使用来自相机制造商的示例代码(只有一个名为“main.cpp”的文件)在 Ubuntu 11.10 下从我的相机中读取图像。如果我使用示例项目,一切正常,我会收到图像数据。但是如果我将这个“main.cpp”添加到我的真实项目中并编译,应用程序就会崩溃。

很难确定导致此错误的部分。但是,如果我从我身上删除一些代码(已编译但绝对没有使用!),程序会按预期工作。我猜我在编译代码时链接的另一个库会导致错误(例如 Opencv 或 boost?)。我试图找出导致这种行为的部分,但如果你们能同时告诉我,我会很高兴从这个崩溃消息中提取有用的信息,可以找到on this Gist。

我的 libc 损坏了吗?

【问题讨论】:

您可能会发现将转储文件的内容粘贴到 Gist 或类似的东西而不是文件共享站点中很有用。 好的,这里是没有文件共享站点的“dump.txt”:gist.github.com/2936131 您确定没有使用此代码吗?静态析构函数怎么样? 我不是 100% 确定,所以我试图通过源文件删除源文件来解决问题(如果我一次删除所有“我的”源文件,它可以工作)。我猜这是链接器使用的另一个库。我提供的 dump.txt 有用吗?还是完全没用? 匿名,尝试在valgrind下启动你的程序。 【参考方案1】:

libc 中的错误?

没有。

*** glibc detected *** ./myProject: double free or corruption (!prev): 0x09c12660 ***

此错误意味着您的应用程序以某种方式损坏了堆。它可能有两次freeed 同一个指针,或者它可能已经写入超过分配缓冲区的末尾。

查找此类堆损坏错误的工具是 Valgrind。

只有在您链接额外代码时才会发生崩溃这一事实很可能只是一个意外——即使没有额外代码,该错误也可能存在于应用程序中,但尚未在崩溃中表现出来。

额外的代码也有可能引入错误,但可能性较小。

在任何一种情况下,一旦你在 Valgrind 下运行应用程序,错误就会变得很明显。

【讨论】:

以上是关于libc中的错误?如何读取转储文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何让android打印掉崩溃系统应用程序的核心转储?

libc 退出调用中的核心转储

试图读取包含整数的文件并存储在整数向量中,但我不断收到“分段错误(核心转储)”错误

如何读取小型转储?

访问共享进程内存时出现分段错误(核心转储)

将稀疏矩阵转储到文件中