如何为服务器运行valgrind?

时间:2019-07-17 12:16:31

标签: c++ memory-leaks valgrind

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

Valgrind还对有效UID的更改敏感,尤其是从根UID运行时。您不能将sudo与valgrind(detailed here)结合使用。

您不能在启用了Linux功能位(details here)的可执行二进制文件上使用Valgrind。

Valgrind无法处理NFS文件系统上的root setuid(即使已挂载以允许这样做)。解决方法是将内部版本或二进制文件移到非NFS分区。

上面已经说了这么多,这是一个时序问题,Valgrind会使事情变得更慢,并且代码的控制流“失去了它的印记”来执行向网络套接字开放的操作。唯一的方法是在整个代码中放入调试打印语句,并确定该时序逻辑。

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

valgrind —follow-children /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 -in打开的端口列表
  • strace
  • netstat -lt
  • tcpdump / wireshark

herehere(最全面的here)给出了适用于Linux的网络故障排除工具的列表。