【问题标题】:How to do memory check on a daemon program?如何对守护程序进行内存检查?
【发布时间】:2023-03-03 10:34:01
【问题描述】:

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

有没有可以做 Valgrind 的工具?

【问题讨论】:

    标签: c++ memory-management memory-leaks valgrind memory-leak-detector


    【解决方案1】:

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

    这个没试过,只是在docs看到过。

    万一链接断开:

    将 GDB 连接到 Valgrind gdbserver

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

    (error参数是gdbserver激活前的错误数:0表示立即开始运行)。

    然后在你的程序上启动 gdb 并连接到远程目标

    $ gdb ./prog
    (gdb) target remote | vgdb
    

    并触发检查

    (gdb) monitor leak_check full reachable any
    

    查看您的文档或链接的文档以获取完整的详细信息。

    【讨论】:

      【解决方案2】:

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

      另外还有valgrind client requestsVALGRIND_DO_LEAK_CHECK VALGRIND_DO_ADDED_LEAK_CHECK VALGRIND_DO_CHANGED_LEAK_CHECK,你可以在你的守护进程中触发,也许是在一个计时器上。然后比较结果可能会告诉您任何泄漏。

      【讨论】:

      • 只是检查我是否理解您要说的内容。你是说我应该有办法在程序中终止?
      • @AlwinDoss 是的——如果你添加了一种干净地关闭你的守护进程的方法,那么 valgrind 可以运行并给你所有的泄漏;假设您在终止期间清理了所有您知道的内存分配。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多