我在嵌入式设备上使用 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-path
中 dlopen
每个 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
。
即使您设法正确设置多线程调试(在任何情况下都应该尝试),这也不太可能帮助您找到堆损坏问题:通常是在您因堆导致崩溃时损坏,所有实际导致它的代码痕迹都消失了。
如果您在目标上使用 glibc
,MALLOC_CHECK_=2
可能会有所帮助。文档 here .
如果您正在使用其他一些 libc
,它可能具有类似的 malloc 调试功能。或者您可以尝试其中一种 many debug mallocs可用。
关于c++ - 如何调试 armv5 上的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477727/