如何为服务器运行valgrind?

How to run valgrind for the server?

本文关键字:valgrind 运行 服务器      更新时间:2023-10-16

我是瓦尔格林德的新手。我需要为用C++编写的服务器运行 valgrind。服务器侦听端口。当在Valgrind内部运行服务器时,我无法与服务器通信。端口未侦听。

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

我需要服务器在我使用 valgrind 运行时侦听端口。

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

Valgrind 仅适用于二进制文件,不能附加到已经在运行的进程(如此处所述)。

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

您不能在启用了 Linux 功能位的可执行二进制文件上进行 Valgrind(详细信息在此处)。

Valgrind 无法处理 NFS 文件系统上的根 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 安全地从其目标进程分离(并让该进程继续运行)并返回到命令外壳提示符。

连接到已在运行的服务器

但是您可以使用strace监视已在运行的生产守护程序服务器,但很难找到已打开的网络套接字fd编号。简要执行上一步以获得该fd

使用ps auxw找出您的 PID。

然后在此处插入服务器/守护程序的 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 的网络故障排除工具列表在这里、这里和最全面的这里给出。