如何在armv5上调试堆损坏

时间:2011-09-19 21:51:23

标签: c++ linux gdb valgrind heap-corruption

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

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

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

我得到了

  

警告:找不到匹配劣质线程的libthread_db   库,线程调试将无法使用。

libthread_db和libpthread来自我的gnueabi工具链。

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

2 个答案:

答案 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.1x86_64-linux,但您使用的是为libthread_db构建的GDB。 64位GDB(显然)无法使用32位glibc

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

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

如果您正在使用其他{{1}},它可能具有类似的malloc调试工具。或者您可以尝试其中一个many debug mallocs

答案 1 :(得分:1)

The answers to this question有很好的指导方针。我会给电动车一个跑步。 This paper也非常有用(即使它会使用valgrind)。