Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何调试随机更改的内存问题_C_Debugging_Memory_Solaris - Fatal编程技术网

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

C 如何调试随机更改的内存问题,c,debugging,memory,solaris,C,Debugging,Memory,Solaris,我的应用程序是一个在Solaris上运行的多线程程序 最近,我发现它可能会崩溃,原因是指针数组中的一个成员从有效值更改为NULL,因此在访问它时,它崩溃了 因为发生率很低,在过去的2个月里,只发生了两次,而且数组中更改的成员也不一样。我找不到重复的步骤,在检查代码之后,没有得到任何有价值的线索 有谁能就如何调试随机更改的内存问题提供一些建议吗 由于无法重现崩溃,因此调试它并不容易 但是,您可以做一些事情: 浏览代码并列出代码中所有写入该变量的位置,特别是那些可以向其写入NULL的位置。很可能其中

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

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

因为发生率很低,在过去的2个月里,只发生了两次,而且数组中更改的成员也不一样。我找不到重复的步骤,在检查代码之后,没有得到任何有价值的线索


有谁能就如何调试随机更改的内存问题提供一些建议吗

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

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

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

  • 尝试开发某种折磨测试,使故障更容易发生(例如以最高速度运行模拟或随机事务)。如果你能以这种方式重现崩溃,你的处境会好得多,因为你可以分析崩溃的实际原因,而不仅仅是猜测

  • 如果可能,在valgrind或purify或类似环境下运行程序。如果他们发出任何警告,追踪导致这些警告的原因并修复;您的程序可能正在访问已释放的内存,这似乎在大部分时间内都能正常工作(如果在访问时未将可用内存重新用于任何用途),但偶尔会失败(当某些东西正在重新使用它时)

  • 在代码中添加一个类似于Electric Fence的内存检查器,或者用一个自定义版本替换free(),该版本使用随机垃圾覆盖可用内存,希望这会使崩溃更容易发生

  • 使用不同的编译器重新编译您的程序(特别是新的/奇特的编译器,比如启用了静态分析器的clang++),并修复它们发出的警告。这可能会指出你的问题

  • 在不同的硬件和操作系统下运行程序;有时,一个操作系统下的模糊问题会在另一个操作系统上产生非常明显的症状

  • 查看已知发生碰撞的各种机器。他们有什么共同点吗?那些没有崩溃的机器呢?他们有什么不同吗


  • 第二步是最重要的一步,因为即使你认为你已经解决了这个问题,你也无法证明它,除非你能在旧代码中重现崩溃,并且不能用固定的代码重现它。如果无法重现故障,您只能猜测特定代码更改是否确实有帮助。

    在该站点添加日志功能。在调试器中运行该程序,并在您关心的内存位置设置内存监视。不过,这假设它是一个可以监视的一致内存位置。否则,像valgrind这样的东西可能有助于查找内存错误。@Cornstales:因为这个问题发生在生产环境中,我认为不可能使用调试器。@C.R:因为我不知道值在何时何地更改,我在哪里添加跟踪?@NanXiao:当日志函数发现指针与您的预期相反变为空时,它可能会转储内存。然后你可以用调试器检查核心转储。分析得很好-听起来你真的经历过这个过程好几次了!