Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在Linux上调试内存损坏_C_Linux_Memory_Core_Heap Corruption - Fatal编程技术网

C 如何在Linux上调试内存损坏

C 如何在Linux上调试内存损坏,c,linux,memory,core,heap-corruption,C,Linux,Memory,Core,Heap Corruption,在我的C应用程序中,我面临着一个非常智能的内存损坏问题 高负载时发生损坏 所以我尝试了purify、valgrind、MPProtected,还尝试编写自己的简单保护机制 Purify/Valgrind-没有帮助,因为它降低了我的应用程序的性能,并且问题没有重现 受保护的使用只需将损坏移动到其他内存位置即可。(因为需要将内存与页面大小对齐) 我的简单保护机制不起作用,因为它还会降低性能 如何在不降低性能的情况下调试我的应用程序?如果您有64位,您可以在同一内存上使用始终执行mmap()的自定义m

在我的C应用程序中,我面临着一个非常智能的内存损坏问题

高负载时发生损坏

所以我尝试了purify、valgrind、MPProtected,还尝试编写自己的简单保护机制

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

受保护的使用只需将损坏移动到其他内存位置即可。(因为需要将内存与页面大小对齐)

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


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

如果您有64位,您可以在同一内存上使用始终执行
mmap()
的自定义
malloc()
,以及执行
munmap()
的自定义
free()
和另一个
mmap()
。用互斥来保护这些东西,以避免致命的竞争状况。这会将首次访问释放内存时的行为更改为fault

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

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

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

在读到这篇文章时,我相信你不仅有一个内存损坏,还有一个或多个种族条件

所以我会给你一个后腿,让你先跑一跑,看看比赛情况。但是如果使用
std::atomic
,helgrind不知道内存顺序。在这种情况下,它会报告误报,并且或多或少无法使用。对于这种情况,我不知道有什么工具可以检查内存顺序,这是目前的一个大问题

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

问题是:为什么你的失败取决于表现?您是否有并行I/O或运行多个任务/线程?如果是这样,降低该任务或线程或I/O的速度,也许可以强制引发错误

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


我知道如果你有调试工具的话,找到已经消失的bug是一场噩梦。但是我们真的帮不了忙,因为我们没有什么可看的。。。所以读水晶球有点难

如果Valgrind找不到它,我会很惊讶。
高负载时会发生损坏。
你怎么知道?另外:监视进程的VSIZ+RSS。可能是你泄漏内存。这不是C++——没有<代码> STD::原子< /代码>。@ JL2210:我不知道为什么我看到这个问题,因为它是5年前。也许现在是用C++:-),问题是C++和C的通用问题。任何人如果发现这么多迟来的答案是有用的,也可能会发现原子的暗示是有用的。但是是的,c没有原子:-)Joshua(另一个回答者之一)通过回答它把它改成了“活动的”。不过,这从来没有被标记为[c++]。