4

我在我的 C 应用程序中面临着非常智能的内存损坏。

高负载时会发生损坏。

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

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

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

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

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

4

2 回答 2

0

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

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

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

于 2019-08-17T17:00:23.020 回答
0

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

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

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

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

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

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

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

于 2019-08-17T18:50:13.600 回答