我在Linux上使用嵌入式设备。 我的架构是armv5。
我相当大(~30kloc)会随着时间的推移发生某种堆腐败。
由于我的拱门不受支持,我无法运行valgrind。 我只能运行一个有限的gdb,因为我的应用程序使用线程,并且腐败很可能发生在其中一个线程中。
我得到了
警告:找不到匹配劣质线程的libthread_db 库,线程调试将无法使用。
libthread_db和libpthread来自我的gnueabi工具链。
我想知道现在最好的行动方式是什么。我应该继续尝试让libthread_db与gdb一起使用吗?或者是否有其他工具,如valgrind,我可以使用?
答案 0 :(得分:3)
警告:无法找到libthread_db匹配劣质的线程库,线程调试将无法使用。
此错误表示GDB尝试dlopen
libthread_db.so.1
libthread-db-search-path
show libthread-db-search-path
{使用libthread_db.so.1
看看是什么)以及libpthread
的所有版本无法使用目标(嵌入式设备)上的libthread-db-search-path
。
您的i686-linux
很可能不正确。
另一种可能性是您的工具链已发送(比方说)libthread_db.so.1
版x86_64-linux
,但您使用的是为libthread_db
构建的GDB。 64位GDB(显然)无法使用32位glibc
。
即使您设法正确设置多线程调试(在任何情况下都应该尝试),但这不太可能帮助您找到堆损坏问题:通常在您因堆而崩溃时腐败,实际导致它的所有代码痕迹都消失了。
如果您在目标上使用MALLOC_CHECK_=2
,libc
可能有所帮助。文档here。
如果您正在使用其他{{1}},它可能具有类似的malloc调试工具。或者您可以尝试其中一个many debug mallocs。
答案 1 :(得分:1)
The answers to this question有很好的指导方针。我会给电动车一个跑步。 This paper也非常有用(即使它会使用valgrind)。