【问题标题】:Attach valgrind with daemon and collect logs for each daemon call将 valgrind 与守护进程连接并收集每个守护进程调用的日志
【发布时间】:2015-01-02 22:18:19
【问题描述】:

我有一个客户端服务器系统,完全用 C++ 编写。服务器以/etc/init.d/serverd 运行,带有启动/停止选项。 Client.execlient.exe --options 执行任何命令。每次客户端调用,守护程序都会命中。 我想附上valgrind/etc/init.d/serverd 来检测泄漏。 我尝试了以下选项但失败了。

/usr/local/bin/valgrind --log-file=valgrind_1.log -v --trace-children=yes --leak-check=full --tool=memcheck --vgdb=yes --vgdb-error=0 /etc/init.d/ serverd start

每次都无法附加守护进程。

我们想要的是将valgrind与守护进程在开始时间 [ the exact point is , I will stop daemon , attach valgrind with it and then start it again ]附加,这样每次client.exe --options的执行,都应该为--log-file=valgrind_1.log中的守护进程生成日志

有没有人知道如何做同样的事情?

【问题讨论】:

  • serverd 的运行脚本是什么样的?

标签: c++ linux valgrind daemon memory-leak-detector


【解决方案1】:

对于 systemd 托管守护进程,您可以更改 ExecStart= 以运行 valgrind,如下所示:

ExecStart={valgrind-command-with-flags} /usr/sbin/foo-daemon

确保将输出重定向到明确定义的位置。

警告:使用 valgrind 运行的守护进程可能非常缓慢,并且可能无法按预期运行

【讨论】:

    【解决方案2】:

    似乎不可能将 valgrind 附加到现有进程: http://valgrind.org/docs/manual/faq.html#faq.attach

    在我看来,最好的做法是杀死守护进程,然后自己运行 valgrind 中的可执行文件。

    【讨论】:

    • 我也做了同样的事情,但无法正确地将 valgrind 与守护进程连接起来。初始日志一直存在,直到守护程序启动,但之后,client.exe 命中的每个守护程序的日志,在日志文件中没有日志,由选项 --log-file=valgrind_1.log 给出。说明 daemon 运行正常,但 valgrind 无法生成日志,无法分析 daemon 的内存泄漏。
    • 所以我不知道答案.. 我允许自己天真的 cmets: 1. 你确定 valgrind 在这种情况下正在运行吗? ps -e | grep valgrind 应该表明这一点。 2. 你确定你在正确的地方搜索日志吗?也许在绝对文件中定义它更安全。
    • @PrashantSingh 如果您的守护进程是例如分叉然后执行。如果上面在 valgrind 下启动了几个进程,你最好使用例如使日志文件“唯一”。 --log-file arg 中的 %p 标记具有日志文件名的 pid 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2023-03-02
    • 2015-09-07
    相关资源
    最近更新 更多