如何调试armv5上的堆损坏

How to debug heap corruption on armv5

本文关键字:损坏 armv5 何调试 调试      更新时间:2023-10-16

我在嵌入式设备上运行linux。我的架构是armv5。

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

我不能运行valgrind,因为我的arch是不支持的。我只能运行一个有限的gdb,因为我的应用程序使用线程和损坏最有可能发生在一个线程。

我得到

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

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

我想知道现在最好的做法是什么。我应该继续尝试让libthread_db与gdb一起工作吗?或者我可以使用valgrind之类的其他工具吗?

警告:无法找到libthread_db匹配的下级线程库,线程调试将不可用。

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

很可能你的libthread-db-search-path只是不正确。

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

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

如果您在目标上使用glibc, MALLOC_CHECK_=2可能会有所帮助。文档在这里。

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

这个问题的答案有很好的指导意义。我想试试电动汽车。这篇论文也非常有用(即使它谈论使用valgrind)。