我编写了一个 C++ 应用程序,它永远运行,直到手动终止。它监视其他重要的应用程序。因此,我的守护程序应用程序不应该关闭。牢记这一点,我想看看我的应用程序中是否存在任何内存泄漏。我使用了 valgrind,但由于此应用程序一直在运行,因此 valgrind 不会退出。如果我做一个控制 - C 那么我不会从 valgrind 日志文件中获得完整的信息。
有没有可以做 Valgrind 的工具?
我编写了一个 C++ 应用程序,它永远运行,直到手动终止。它监视其他重要的应用程序。因此,我的守护程序应用程序不应该关闭。牢记这一点,我想看看我的应用程序中是否存在任何内存泄漏。我使用了 valgrind,但由于此应用程序一直在运行,因此 valgrind 不会退出。如果我做一个控制 - C 那么我不会从 valgrind 日志文件中获得完整的信息。
有没有可以做 Valgrind 的工具?
我相信您可以将 gdb 连接到正在运行的 valgrind 进程,并指示它显式运行泄漏检查。
我没有试过这个,只是在文档中看到过。
如果链接断开:
$ valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prog
(错误参数是 gdbserver 激活之前的错误数:零表示它立即开始运行)。
然后在您的程序上启动 gdb 并连接到远程目标
$ gdb ./prog
(gdb) target remote | vgdb
并触发检查
(gdb) monitor leak_check full reachable any
有关完整详细信息,请参阅您的文档或链接的文档。
最明显的方法是添加一个干净的方法来关闭守护进程,可能是通过捕获 SIGTERM 信号并关闭。否则,当您杀死守护程序时(合法地)使用的任何内存都会使结果复杂化。
或者,有valgrind 客户端请求VALGRIND_DO_LEAK_CHECK VALGRIND_DO_ADDED_LEAK_CHECK VALGRIND_DO_CHANGED_LEAK_CHECK 你可以在你的守护进程中触发,也许在一个计时器上。然后比较结果可能会告诉您任何泄漏。
在某些时候不退出就无法检测到泄漏。我认为您可以使用 valgrind 并在 5 分钟后让守护进程退出。然后 valgrind 将报告您的泄漏。请记住,如果您的守护程序由于算法中的逻辑缺陷而不断分配内存,它仍然可能耗尽内存而代码中没有任何泄漏。