我编写了一个C ++应用程序,它一直运行直到手动终止。 它监视其他重要应用程序。因此,我的守护进程应用程序不应该关闭。 记住这一点,我想看看我的应用程序中是否有任何内存泄漏。 我使用了valgrind,但由于这个应用程序一直在运行,因此valgrind不会退出。如果我做了一个控件 - 那么我就不会从valgrind日志文件中获得完整的信息。
有没有一种工具可以做Valgrind的工作?
答案 0 :(得分:5)
我相信你可以将gdb连接到正在运行的valgrind进程,并指示它明确地运行泄漏检查。
我没有试过这个,只是在docs中看到了它。
如果链接断线:
$ 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将报告您的泄漏情况。请记住,如果你的守护程序由于算法中的逻辑缺陷而不断分配内存,它仍然会耗尽内存而代码中没有任何泄漏。