如何调试内存随机更改问题

时间:2013-12-23 05:40:28

标签: c debugging memory solaris

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

最近,我发现它可能会崩溃,原因是指针数组中的一个成员从有效值更改为NULL,因此在访问它时,它崩溃了。

由于发生率非常低,在过去的2个月中,它只发生了两次,并且阵列中变化的成员不一样。我找不到重复的步骤,在查看代码后,没有得到有价值的线索。

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

1 个答案:

答案 0 :(得分:4)

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

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

  1. 浏览代码并列出代码中写入该变量的所有位置 - 特别是那些可以向其写入NULL的位置。很可能其中一个是你的罪魁祸首。

  2. 尝试开发某种折磨测试,使故障更容易发生(例如,以最高速度运行模拟或随机事务)。如果您能以这种方式重现崩溃,那么您将处于更好的状态,因为您可以分析崩溃的实际原因而不仅仅是推测。

  3. 如果可能,请在valgrind或purify或类似程序下运行程序。如果他们发出任何警告,请追踪导致这些警告的原因并予以修复;您的程序可能是例如访问已释放的内存,这可能在大多数情况下似乎都有效(如果可用内存在访问时没有被重用),但偶尔会失败(当某些内容重新使用时) )

  4. 在你的代码中添加一个像Electric Fence这样的内存检查程序,或者只用一个用随机垃圾覆盖空闲内存的自定义版本替换free(),希望这会使崩溃更容易发生。 / p>

  5. 使用不同的编译器重新编译您的程序(尤其是新的/花哨的程序,如启用静态分析器的clang ++)并修复他们警告的任何内容。这可能会指出您的问题。

  6. 在不同的硬件和操作系统下运行程序;有时,一个操作系统下的一个模糊问题会给另一个操作系统带来明显的症状。

  7. 查看已知发生崩溃的各种机器。他们都有共同点吗?它没有崩溃的机器怎么样?他们有什么不同吗?

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