【问题标题】:How to debug the memory is changed randomly issue如何调试内存随机更改问题
【发布时间】:2013-12-23 05:40:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在该站点添加日志功能。
  • 在调试器中运行程序,并在您关心的内存位置设置内存监视。不过,这假设它是您可以观看的一致内存位置。否则,类似 valgrind 的东西可能有助于发现内存错误。
  • @Cornstalks:因为这个问题是在生产环境中出现的,所以我认为不能使用调试器。
  • @C.R.:因为不知道值是什么时候在哪里改的,所以在哪里添加trace呢?
  • @NanXiao:日志功能在发现指针变为空时会转储内存,这与您的预期相反。然后您可以使用调试器检查核心转储。

标签: c debugging memory solaris


【解决方案1】:

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

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

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

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

  3. 如果可能,请在 valgrind 或 purify 或类似工具下运行程序。如果他们发出任何警告,请找出导致这些警告的原因并进行修复;例如,您的程序可能正在访问已释放的内存,这似乎在大多数情况下都可以工作(如果空闲内存在被访问时没有被重用)但偶尔会失败(当有东西重用它时) )

  4. 在您的代码中添加一个像 Electric Fence 这样的内存检查器,或者只是将 free() 替换为一个自定义版本,该版本会用随机垃圾覆盖空闲内存,希望这会使崩溃更有可能发生。

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

  6. 在不同的硬件和操作系统下运行程序;有时,一个操作系统下的一个不起眼的问题会在另一个操作系统上表现出非常明显的症状。

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

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

【讨论】:

  • 很好的分析——听起来你真的经历过几次这个过程!
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2018-01-26
  • 1970-01-01
  • 2021-12-17
  • 2012-03-24
相关资源
最近更新 更多