首页 > 解决方案 > 如何为服务器运行 valgrind?

问题描述

我是 valgrind 的新手。我需要为用 C++ 编写的服务器运行 valgrind。服务器监听一个端口。在 Valgrind 中运行服务器时,我无法与服务器通信。端口未在监听。

valgrind --tool=memcheck --leak-check=yes --log-file=valgrind_log.txt /binary_path-c

当我使用 valgrind 运行时,我需要服务器应该监听端口。

标签: c++memory-leaksvalgrind

解决方案


如果您已经确认完全相同的二进制文件正在执行所需的网络套接字 open() 并且它在 Valgrind 中不起作用,那么请继续阅读。

Valgrind 仅适用于二进制文件,不能附加到已经运行的进程(如解释here)。

Valgrind 对有效 UID 的更改也很敏感,尤其是在从根 UID 运行时。您不能sudo与 valgrind 一起使用(在此处详述)。

您不能在启用了 Linux 功能位的可执行二进制文件上使用 Valgrind(详情请点击此处)。

Valgrind 无法处理 NFS 文件系统上的 root setuid(即使安装时允许这样做)。解决方法是将构建或二进制文件移动到非 NFS 分区。

上面说了这么多,这是一个时间问题,Valgrind 让事情变得更慢,并且你的代码的控制流“错过了它的标记”来执行对网络套接字的打开。唯一的方法是在整个代码中放入调试打印语句并确定时序逻辑。

或者...要查看生产级守护程序从启动一开始就在做什么,请执行:

valgrind --trace-children=yes /usr/skin/<your-server-binary>

还有另一种监控网络套接字的方法,请继续阅读......

从执行开始跟踪

您可以从一开始就执行strace并通过以下方式找出打开了哪个网络套接字(稍后将描述,显示其缓冲区内容):

strace -eopen <your-server-binary> <server-arguments>

记下所需的fd(文件描述符)编号。

strace启动进程的任何命令一样,按 Ctrl-C 将停止该进程。但是在实时进程上使用 strace,您可以使用 Ctrl-C 安全地从其目标进程中分离(并让该进程继续运行)并返回到命令 shell 提示符。

附加到已经运行的服务器

但是您可以使用监视已经运行的生产守护程序服务器,strace但很难找到fd您的网络套接字的打开号码。简单地做上一步来得到它fd

使用 找出您的 PID ps auxw

然后在此处插入您的服务器/守护进程的 PID:

 strace -f -p <your-server-PID -fnetwork

找出它的fd号码。

精确的套接字监控

有了fd手头的标识,重新运行 strace 以附加到该生产服务器:

strace -f -eread=<fd> -ewrite=<fd> -p<your-daemon-PID>

网络故障排除清单

  • lsof -i -n开放端口列表
  • strace
  • netstat -lt
  • tcpdump/wireshark

Linux 网络故障排除工具列表在这里这里和最全面的这里提供。


推荐阅读