【问题标题】:Valgrind output when process is stopped using SIGINT使用 SIGINT 停止进程时的 Valgrind 输出
【发布时间】:2015-04-21 07:24:27
【问题描述】:

我们有一个庞大的应用程序,其中某些部分(线程)不会完全关闭,因此内存不会在析构函数中显式释放,因为它们从未被调用。因此,我正在使用 valgrind 测试应用程序,方法是使用 Ctrl + C(SIGINT) 命令中断进程,该命令以某种方式停止进程。 Valgrind 显示了很多泄漏(肯定也可能泄漏)。我正在使用以下选项运行 valgrind

valgrind --leak-check=full --log-file="valgrind5.out" -v ./MyProcess

我对此有两个问题

  1. 在 valgrind 输出中,我可以看到非常多的跟踪,并带有以下输出

==2833== 99 个块中的 3,330 字节肯定丢失在 34,381 的丢失记录 33,556 中 ==2833== 34,381 的丢失记录 33,557 中可能丢失了 58 个块中的 3,337 个字节

在这种情况下,当使用 SIGINT 停止进程时,我是否可以将“肯定丢失”视为内存泄漏?

  1. Valgrind 仅在进程停止后才会根据未初始化的变量转储有关泄漏和跳转的所有信息。我假设 valgrind 可以在运行时检测到“肯定丢失”的内存泄漏,并立即打印在控制台或 valgrind 日志文件上。假设错了吗?

【问题讨论】:

  • 您需要在程序中捕获 sigint 才能调用关闭部分。
  • 肯定丢失的是你的内存泄漏,这是没有任何指针指向的内存。可以通过您的野蛮阻止来解释偷窃可及。
  • @Ôrel 这是一个由许多开发人员处理的巨大应用程序,因此 SIGINT 在到达我们的应用程序之前就消失了,我们被强行杀死

标签: c++ memory-leaks valgrind


【解决方案1】:

正如 Orel 所提到的,无论您的应用程序正常终止还是被 SIGINT 中断,“肯定丢失”确实是相关的。 但是,valgrind 不会在看到泄漏后立即显示它们。我认为这是因为检测泄漏可能需要时间,并且不应该太频繁地进行。 如果您想尽快显示所有泄漏,您可以尝试使用 Boehm-Weiser 垃圾收集库 (http://www.hboehm.info/gc/),它实际上不会释放内存,而只是报告它认为没有的内容更长的可访问对象。 这当然是一项不平凡的努力,但它可能是值得的。

你也可以开始使用 unique_ptr 和 shared_ptr 多一点,以便自动释放内存。并且还将东西包装在一个类中,例如以确保析构函数释放内存并关闭文件句柄。

【讨论】:

  • 感谢您的更新。由于我们的代码库很大,并且由许多具有不同技能的开发人员开发,并且滥用 C++11(如 lambdas),即使使用 unique_ptr 和 shared_ptr 也会产生一些问题,例如访问无效内存。
  • 我很想知道在 shared_ptr 的情况下的这种情况,但是?根据定义,当周围至少有一个这样的 ptr 时,它们不会释放内存。如果您只想监视内存而不阻止其释放,则可以将其与weak_ptr 结合使用。在这种情况下,当内存被释放时,指针将被重置为空。
  • 我观察到的一个问题是在异步执行的 lambda 中通过引用传递 shared_ptr。因此,当调用 lambda 时,shared_ptr 指向的对象不再存在
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多