8

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

有没有可以做 Valgrind 的工具?

4

3 回答 3

6

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

我没有试过这个,只是在文档中看到过。

如果链接断开:

将 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

有关完整详细信息,请参阅您的文档或链接的文档。

于 2012-02-14T11:36:59.203 回答
4

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

或者,有valgrind 客户端请求VALGRIND_DO_LEAK_CHECK VALGRIND_DO_ADDED_LEAK_CHECK VALGRIND_DO_CHANGED_LEAK_CHECK 你可以在你的守护进程中触发,也许在一个计时器上。然后比较结果可能会告诉您任何泄漏。

于 2012-02-14T11:32:17.770 回答
0

在某些时候不退出就无法检测到泄漏。我认为您可以使用 valgrind 并在 5 分钟后让守护进程退出。然后 valgrind 将报告您的泄漏。请记住,如果您的守护程序由于算法中的逻辑缺陷而不断分配内存,它仍然可能耗尽内存而代码中没有任何泄漏。

于 2012-02-14T11:35:26.507 回答