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

How to do memory check on a daemon program?

本文关键字:内存 检查 守护程序      更新时间:2023-10-16

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

有没有一种工具可以像Valgrind那样做?

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

我没有尝试过,只是在文档中看到了。

在链路中断的情况下:

将GDB连接到Valgrind gdbserver

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

(error参数是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,让deamon在5分钟后退出。然后valgrind会报告你的泄漏。请记住,如果您的deamon由于算法中的逻辑缺陷而持续分配内存,那么它仍然可能耗尽内存,而不会在代码中出现任何泄漏。