如何在Linux上调试内存损坏

时间:2013-10-18 11:18:46

标签: c linux memory core heisenbug

我在C应用程序中遇到了非常智能的内存损坏。

高负荷会导致腐败。

所以我尝试了净化,修复,保护,我也尝试编写自己的简单保护机制。

净化 / Valgring - 没有帮助,因为它减少了我的应用程序的重现性,并且没有重现问题。

mprotected 用法jast将损坏移到其他内存位置。 (因为它需要将内存与页面大小对齐)。

我的简单保护机制不起作用,因为它也会降低性能。

如何在不降低性能的情况下调试应用程序?

2 个答案:

答案 0 :(得分:0)

如果您有64位,则可以在页面上使用始终执行malloc()的自定义mmap()和执行free()的自定义munmap()以及另一个mmap()相同的记忆。用互斥锁保护这些东西,以免发生致命的竞争状况。这会将行为更改为在首次访问释放的内存时出现故障。

如果找不到,请调整自定义malloc(),以将分配的缓冲区在mmapped区域中尽可能高地移动。

请注意,您不能在32位中执行此操作,因为这会疯狂地烧毁地址空间。

答案 1 :(得分:0)

  

Purify / Valgrind-没有帮助,因为它降低了我的应用程序的性能,并且未再现问题。

在阅读的同时,我相信您不仅有内存损坏,而且还有一个或多个比赛条件。

因此,我想请您先与helgrind赛跑,以找到比赛条件。但是,如果您使用std::atomic,则helgrind不知道内存的顺序。在这种情况下,它报告为误报,或多或少不可用。对于这种情况,我不知道有什么工具可以检查内存顺序,这在当前是个大问题。

  

如何调试我的应用程序而不会降低性能?

问题是:为什么您的失败取决于性能?您是否具有并行I / O或运行多个任务/线程?如果是这样,请降低该任务或线程或I / O的速度,也许您可​​以强制提高错误率。

提示以减慢其他线程/任务的速度: 在linux上,您可以将线程/任务绑定到cpu / core,并希望通过在该内核上添加多个“ stopper”任务来消耗该内核的更多功能。 taskset。您还可以使用-O0或其他技巧来编译代码的特殊部分。

我知道,如果有适当的调试工具,要查找消失的bug真是一场噩梦。但是我们实在无能为力,因为我们没什么好看的...所以有点像读水晶球!