如何对守护程序进行内存检查
How to do memory check on a daemon program?
我编写了一个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由于算法中的逻辑缺陷而持续分配内存,那么它仍然可能耗尽内存,而不会在代码中出现任何泄漏。
相关文章:
- 检查nullptr是否100%保护内存布局不受segfault影响
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 如何使用 Malloc 调试来检查本机内存泄漏?
- 如何在c/c++中检查两个任意内存范围是否重叠
- 如何检查C++智能指针内存分配是否成功?
- 投射空指针以检查内存对齐情况
- 有没有办法检查内存缓存是否已重新启动?
- 为什么我的 C++ 程序在执行 TCMALLOC 堆检查器或堆配置文件时使用大量内存
- 如何检查是否可以在C 中使用某个内存地址
- 检查destructor是否正在破坏所有动态内存
- 在编译时检查特征类型保存的数据在内存中是否连续
- 我可以检查共享内存中是否存在地址
- 如何检查指针是否指向正确对齐的内存位置
- 使用GDB并检查Data的内存布局
- Malloc内存检查是否连续
- 嵌入的Linux PPC32动态内存检查工具
- 与实际内存内容相比,GDB 内存检查输出偏差 8 个字节
- 如何对守护程序进行内存检查
- 双指针内存检查,我们是否需要单独删除两者
- 运行valgrind/其他内存检查通过eclipse luna在Windows-8 64位