最好的调试方法"损坏的双链表"紧急

时间:2015-12-09 19:56:06

标签: linux c++11 gdb heap

我正在调试一个"损坏的双链表"崩溃。我已经看过源代码并理解了chunk结构和fd / bk指针等,所以我想我知道为什么会发生这种崩溃。我现在正在努力解决它,我有几个问题。

问题#1:where(关于从malloc返回的指针)是malloc_chunks结构维护的吗?它们是在内存块之前还是之后?

问题2:分配内存的malloc_chunks与未分配内存的malloc_chunks不同。看来(??)分配的缓冲区大小写没有fd / bk指针。它是否正确?

问题3:调试此类错误的推荐方法是什么?我假设我应该为malloc_chunks设置一个断点,这样我就可以在覆盖结构时中断。但我不知道如何访问那些malloc结构,所以我可以在gdb中设置一个断点。

非常感谢任何关于如何进行的建议。

谢谢, -Andres

2 个答案:

答案 0 :(得分:4)

  

调试此类错误的推荐方法是什么?

通常的方法是来查看GLIBC内部,但要使用像ValgrindAddressSanitizer这样的工具,其中任何一个都可能直接指向你问题

<强>更新

  

Valgrind崩溃......

您应该尝试从源代码构建最新的Valgrind版本,如果仍然崩溃,请将崩溃报告给Valgrind开发人员。

可能已经修复了Valgrind问题,构建新的Valgrind并用它来测试你的程序仍然比试图调试GLIBC内部更快(堆腐败错误臭名昭着

  

AddressSanitizer,我认为它只是一个铿锵的工具 - 我认为它不适用于Linux。

两点:

  1. Clang在Linux上运行得很好,我几乎每天都使用它,
  2. Recent GCC versions具有等效的-fsanitize=address选项。

答案 1 :(得分:0)

有些方法可以在没有valgrind的情况下调试堆溢出。

一种方法是使用malloc调试库,例如Electric Fence。它会使您的rogram在访问堆中的非法地址时完全崩溃。

另一种方法是使用GNU malloc的内置调试功能。见man mcheck。如果在第一次调用mcheck_pedantic之前调用malloc,则会在每次分配时检查每个内存块。这非常慢,但可以让您隔离故障。