我在C应用程序中遇到了非常智能的内存损坏。
高负荷会导致腐败。
所以我尝试了净化,修复,保护,我也尝试编写自己的简单保护机制。
净化 / Valgring - 没有帮助,因为它减少了我的应用程序的重现性,并且没有重现问题。
mprotected 用法jast将损坏移到其他内存位置。 (因为它需要将内存与页面大小对齐)。
我的简单保护机制不起作用,因为它也会降低性能。
如何在不降低性能的情况下调试应用程序?
答案 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真是一场噩梦。但是我们实在无能为力,因为我们没什么好看的...所以有点像读水晶球!