c++ - 如何为服务器运行 valgrind?
问题描述
我是 valgrind 的新手。我需要为用 C++ 编写的服务器运行 valgrind。服务器监听一个端口。在 Valgrind 中运行服务器时,我无法与服务器通信。端口未在监听。
valgrind --tool=memcheck --leak-check=yes --log-file=valgrind_log.txt /binary_path-c
当我使用 valgrind 运行时,我需要服务器应该监听端口。
解决方案
如果您已经确认完全相同的二进制文件正在执行所需的网络套接字 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
推荐阅读
- laravel - 取消链接权限被拒绝 Laravel forge/envoyer
- scala - 如何在 Akka Http 中以编程方式调用 Route
- amazon-web-services - AWS Cloudwatch 仪表板:如何将仪表板从一个账户添加到另一个账户
- ionic-framework - PouchDB 在某些设备上不同步
- python-3.x - 在尝试生成设备时观察 TypeError
- python - 如何在单击中为组操作创建例外
- c++ - 如何自定义排序 VCL TListBox?
- c# - 在 UWP 应用中获取计算机上任何文件的路径
- html - CSS3单选按钮自定义
- html - 内联元素的盒子模型