c++ - 如何调试 armv5 上的堆损坏

标签 c++ linux gdb valgrind heap-corruption

我在嵌入式设备上使用 Linux。 我的架构是 armv5。

我的相当大的 (~30kloc) 随着时间的推移会发生某种堆损坏。

我无法运行 valgrind,因为我的 arch 不受支持。 我只能运行有限的 gdb,因为我的应用程序使用线程并且损坏很可能发生在其中一个线程中。

我明白了

warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

libthread_db 和 libpthread 来 self 的 gnueabi 工具链。

我想知道现在最好的行动方案是什么。我应该继续尝试让 libthread_db 与 gdb 一起工作吗?或者我可以使用其他一些工具,例如 valgrind?

最佳答案

warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

此错误意味着 GDB 试图从 libthread-db-search-pathdlopen 每个 libthread_db.so.1(使用 show libthread-db-search-path 看看那是什么),所有版本的 libthread_db.so.1 都无法与您的 libpthread 一起使用在目标(您的嵌入式设备)上。

很可能您的 libthread-db-search-path 完全不正确。

另一种可能性是您的工具链发布(例如)i686-linux 版本的 libthread_db.so.1,但您使用的是为 x86_64- 构建的 GDB Linux。 64 位 GDB(显然)不能 dlopen 32 位 libthread_db

即使您设法正确设置多线程调试(在任何情况下都应该尝试),这也不太可能帮助您找到堆损坏问题:通常是在您因堆导致崩溃时损坏,所有实际导致它的代码痕迹都消失了。

如果您在目标上使用 glibcMALLOC_CHECK_=2 可能会有所帮助。文档 here .

如果您正在使用其他一些 libc,它可能具有类似的 malloc 调试功能。或者您可以尝试其中一种 many debug mallocs可用。

关于c++ - 如何调试 armv5 上的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477727/

相关文章:

C++:防止在 const 函数中更改指针的值

c++ - 无法在 QGLWidget 中设置所需的 OpenGL 版本

linux - 添加另一列到 awk 输出

Python如何在不使用 super 用户权限的情况下创建pycache文件夹?

linux - 如何使用GDB提取结构成员的值

c++ - 是否允许优化编译器省略在短路中间接使用的函数调用?

c++ - OpenCV:无法加载库 libopencv_calib3d.2.4.dylib 时出错

linux - 将文件名添加到制表符分隔文件中每一行开头的循环(从而生成一个新列))

cocoa - gdb 声称它不知道如何运行

c++ - gdb 将内存地址解释为对象