c - 如何在 Linux 上调试内存损坏

标签 c linux memory heap-corruption

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

高负载时会发生损坏。

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

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

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

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

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

最佳答案

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

如果没有找到,调整自定义的malloc(),将分配的缓冲区移动到映射区域中尽可能高的位置。

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

关于c - 如何在 Linux 上调试内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19448412/

相关文章:

c++ - 使用 numa_alloc_onnode() 分配小块有限制吗?

linux - 将 crt 上传到运行 Amazon Linux 的 ec2

c++ - 有没有一种方法可以映射大小为 n 的集合的所有子集以在 < O(n) 时间内访问特定的子集元素

C# 方法的内存处理

objective-c - 我应该总是为失败的初始化方法释放 self 吗?

c - fork系统调用导致段错误

c - 通过通用网络链接从内核到用户空间接收具有 2 个以上字段的结构时出现问题

C# 移植到 Linux Mono 或 .NET Core

c - 如何在内核中使用copyout?

c - 删除 C 中的数据依赖