如何对守护程序进行内存检查?

时间:2012-02-14 11:28:52

标签: c++ memory-management memory-leaks valgrind memory-leak-detector

我编写了一个C ++应用程序,它一直运行直到手动终止。 它监视其他重要应用程序。因此,我的守护进程应用程序不应该关闭。 记住这一点,我想看看我的应用程序中是否有任何内存泄漏。 我使用了valgrind,但由于这个应用程序一直在运行,因此valgrind不会退出。如果我做了一个控件 - 那么我就不会从valgrind日志文件中获得完整的信息。

有没有一种工具可以做Valgrind的工作?

3 个答案:

答案 0 :(得分:5)

我相信你可以将gdb连接到正在运行的valgrind进程,并指示它明确地运行泄漏检查。

我没有试过这个,只是在docs中看到了它。

如果链接断线:

将GDB连接到Valgrind gdbserver

$ valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prog

(错误参数是gdbserver变为活动之前的错误数:零表示它立即开始运行。)

然后在您的程序上启动gdb并连接到远程目标

$ gdb ./prog
(gdb) target remote | vgdb

并触发检查

(gdb) monitor leak_check full reachable any

有关详细信息,请参阅您的文档或相关文档。

答案 1 :(得分:4)

最明显的方法是添加一种干净的方法来关闭守护进程,可能是通过捕获SIGTERM信号并关闭。否则,当你杀死守护进程时,任何正在使用的内存(合法地)都会使结果复杂化。

或者有valgrind client requests VALGRIND_DO_LEAK_CHECK VALGRIND_DO_ADDED_LEAK_CHECK VALGRIND_DO_CHANGED_LEAK_CHECK您可以在守护程序中触发,也许在计时器上触发。然后比较结果可能会告诉你任何泄漏。

答案 2 :(得分:0)

如果不退出,您无法检测到泄漏。我想你可以使用valgrind并在说5分钟后让deamon退出。然后valgrind将报告您的泄漏情况。请记住,如果你的守护程序由于算法中的逻辑缺陷而不断分配内存,它仍然会耗尽内存而代码中没有任何泄漏。