【问题标题】:How to debug memory corruption on Linux如何在 Linux 上调试内存损坏
【发布时间】:2013-10-27 05:21:49
【问题描述】:

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

高负载时会发生损坏。

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

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

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

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

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

【问题讨论】:

  • 如果 Valgrind 找不到它我会很惊讶....
  • Corruption occures on hight load. 你怎么知道?另外:监控进程的VSIZ+RSS。可能是你只是在泄漏内存。

标签: c linux memory core heap-corruption


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    在阅读时,我相信您不仅有内存损坏,还有一个或多个竞争条件。

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

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

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

    减慢其他线程/任务的提示: 在 linux 上,您可以将线程/任务绑定到 cpu/核心,并且您希望可以通过在该核心上添加多个“停止器”任务来消耗该单一核心上的更多功率。 taskset。您还可以使用 -O0 或其他 hack 编译代码的特殊部分。

    我知道,如果您有适当的调试工具,找到已经消失的错误是一场噩梦。但是我们真的帮不上忙,因为我们没什么可看的……所以有点看水晶球!

    【讨论】:

    • 这不是 C++ -- 没有 std::atomic
    • @JL2210:我不知道为什么我看到这个问题是 5 年前的问题。也许现在是 c++ :-) 这个问题对于 c++ 和 c 来说是通用的。任何发现迟到的答案很有用的人也可能会发现原子提示很有用。但是,是的,c 没有原子 :-)
    • Joshua(其他回答者之一)通过回答将其撞到“活跃”。
    • 不过,这从未被标记为 [c++]。
    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多