C 如何调试随机更改的内存问题
我的应用程序是一个在Solaris上运行的多线程程序 最近,我发现它可能会崩溃,原因是指针数组中的一个成员从有效值更改为C 如何调试随机更改的内存问题,c,debugging,memory,solaris,C,Debugging,Memory,Solaris,我的应用程序是一个在Solaris上运行的多线程程序 最近,我发现它可能会崩溃,原因是指针数组中的一个成员从有效值更改为NULL,因此在访问它时,它崩溃了 因为发生率很低,在过去的2个月里,只发生了两次,而且数组中更改的成员也不一样。我找不到重复的步骤,在检查代码之后,没有得到任何有价值的线索 有谁能就如何调试随机更改的内存问题提供一些建议吗 由于无法重现崩溃,因此调试它并不容易 但是,您可以做一些事情: 浏览代码并列出代码中所有写入该变量的位置,特别是那些可以向其写入NULL的位置。很可能其中
NULL
,因此在访问它时,它崩溃了
因为发生率很低,在过去的2个月里,只发生了两次,而且数组中更改的成员也不一样。我找不到重复的步骤,在检查代码之后,没有得到任何有价值的线索
有谁能就如何调试随机更改的内存问题提供一些建议吗 由于无法重现崩溃,因此调试它并不容易 但是,您可以做一些事情:
第二步是最重要的一步,因为即使你认为你已经解决了这个问题,你也无法证明它,除非你能在旧代码中重现崩溃,并且不能用固定的代码重现它。如果无法重现故障,您只能猜测特定代码更改是否确实有帮助。在该站点添加日志功能。在调试器中运行该程序,并在您关心的内存位置设置内存监视。不过,这假设它是一个可以监视的一致内存位置。否则,像valgrind这样的东西可能有助于查找内存错误。@Cornstales:因为这个问题发生在生产环境中,我认为不可能使用调试器。@C.R:因为我不知道值在何时何地更改,我在哪里添加跟踪?@NanXiao:当日志函数发现指针与您的预期相反变为空时,它可能会转储内存。然后你可以用调试器检查核心转储。分析得很好-听起来你真的经历过这个过程好几次了!