c - 如何调试内存随机变化问题

标签 c debugging memory solaris

我的应用程序是在 Solaris 上运行的多线程程序。

最近发现可能会死机,原因是指针数组中的一个成员从有效值变为NULL ,所以当访问它时,它崩溃了。

因为出现率很低,在过去的2个月里,只出现过两次,而且数组中变化的成员也不一样。我找不到重复的步骤,在查看代码后,没有得到有值(value)的线索。

任何人都可以就如何调试内存随机更改问题提供一些建议吗?

最佳答案

由于您无法重现崩溃,因此调试它并不容易。

但是,您可以做一些事情:

  • 浏览代码并列出代码中写入该变量的所有位置 - 特别是可以向其写入 NULL 的位置。其中之一很可能是你的罪魁祸首。
  • 尝试开发某种使故障更可能发生的折磨测试(例如,以最高速度运行模拟或随机事务)。如果您可以通过这种方式重现崩溃,您的情况会好得多,因为您可以分析崩溃的实际原因,而不仅仅是推测。
  • 如果可能,请在 valgrind 或 purify 或类似环境下运行该程序。如果他们发出任何警告,请追踪导致这些警告的原因并修复它;例如,您的程序可能正在访问已释放的内存,这似乎在大部分时间都可以工作(如果空闲内存在访问时没有被重用),但偶尔会失败(当某些东西正在重用它时) )
  • 在你的代码中添加一个像 Electric Fence 这样的内存检查器,或者只是用一个自定义版本替换 free() 用随机垃圾覆盖空闲内存,希望这会让崩溃更有可能发生。
  • 使用不同的编译器(尤其是启用了静态分析器的 clang++ 之类的新/花哨的编译器)重新编译您的程序,并修复它们警告的任何内容。这可能会指出您的问题。
  • 在不同的硬件和操作系统下运行程序;有时,一个操作系统下的一个不起眼的问题会在另一个操作系统上产生非常明显的症状。
  • 查看已知发生崩溃的各种机器。他们有什么共同点吗?那些没有崩溃的机器呢?他们有什么不同吗?

  • 第2步真的是最重要的一步,因为即使你认为你已经修复了问题,你也无法证明它,除非你可以在旧代码中重现崩溃,并且无法用修复代码重现它。无法重现错误,您只是在猜测特定的代码更改是否真的有帮助。

    关于c - 如何调试内存随机变化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737582/

    相关文章:

    c++ - 为什么对堆栈中的内存使用自定义动态内存分配?

    linux - 虚拟连续与物理连续内存

    php - 为什么整数值占用 72 字节的内存?

    用 C 计算 Pi 到几百万位

    c - 为什么 SPICE 包含 NULL 文件?

    debugging - Chrome : Uncaught SyntaxError: Unexpected end of input

    java - IntelliJ 无法调试

    python - Emacs:使用 pdbtrack (python.el)

    c++ - 我怎么知道我正在使用什么操作系统?

    无法解释此 C 代码片段的行为