如何调试armv5上的堆损坏
How to debug heap corruption on armv5
我在嵌入式设备上运行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.1
的i686-linux
版本,但您正在使用为x86_64-linux
构建的GDB。64位GDB(显然)不能打开32位libthread_db
.
即使你设法正确地设置了多线程调试(在任何情况下你都应该尝试),它也不太可能帮助你找到堆损坏问题:通常当你因为堆损坏而崩溃时,所有实际导致它的代码痕迹都消失了。
如果您在目标上使用glibc
, MALLOC_CHECK_=2
可能会有所帮助。文档在这里。
如果您正在使用其他libc
,它可能具有类似的malloc调试功能。或者您可以尝试其中一个可用的调试malloc。
这个问题的答案有很好的指导意义。我想试试电动汽车。这篇论文也非常有用(即使它谈论使用valgrind)。
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 正在调试 malloc():新内存损坏
- 如何调试armv5上的堆损坏