如何找到打开套接字的函数
How to find which function opened the socket?
我有一个进程在一个系统中24*7运行。最近有报告说,这个进程打开了太多的套接字,耗尽了它的最大限制。
root@typhoon-base-unit0:/root> lsof -p 681 | grep -i sock | wc -l
1018
root@typhoon-base-unit0:/root>
Strace显示它每次迭代打开/关闭一个套接字,但是突然有许多套接字被进程打开而没有正确关闭。
socket(PF_NETLINK, SOCK_DGRAM, 11) = 485
socket(PF_NETLINK, SOCK_DGRAM, 11) = 486
socket(PF_NETLINK, SOCK_DGRAM, 11) = 487
socket(PF_NETLINK, SOCK_DGRAM, 11) = 488
socket(PF_NETLINK, SOCK_DGRAM, 11) = 489
socket(PF_NETLINK, SOCK_DGRAM, 11) = 490
socket(PF_NETLINK, SOCK_DGRAM, 11) = 491
socket(PF_NETLINK, SOCK_DGRAM, 11) = 492
socket(PF_NETLINK, SOCK_DGRAM, 11) = 493
socket(PF_NETLINK, SOCK_DGRAM, 11) = 494
socket(PF_NETLINK, SOCK_DGRAM, 11) = 495
socket(PF_NETLINK, SOCK_DGRAM, 11) = 496
socket(PF_NETLINK, SOCK_DGRAM, 11) = 497
socket(PF_NETLINK, SOCK_DGRAM, 11) = 498
socket(PF_NETLINK, SOCK_DGRAM, 11) = 499
socket(PF_NETLINK, SOCK_DGRAM, 11) = 500
socket(PF_NETLINK, SOCK_DGRAM, 11) = 501
socket(PF_NETLINK, SOCK_DGRAM, 11) = 502
socket(PF_NETLINK, SOCK_DGRAM, 11) = 503
socket(PF_NETLINK, SOCK_DGRAM, 11) = 504
socket(PF_NETLINK, SOCK_DGRAM, 11) = 505
socket(PF_NETLINK, SOCK_DGRAM, 11) = 506
socket(PF_NETLINK, SOCK_DGRAM, 11) = 507
socket(PF_NETLINK, SOCK_DGRAM, 11) = 508
socket(PF_NETLINK, SOCK_DGRAM, 11) = 509
socket(PF_NETLINK, SOCK_DGRAM, 11) = 510
socket(PF_NETLINK, SOCK_DGRAM, 11) = 511
socket(PF_NETLINK, SOCK_DGRAM, 11) = 512
socket(0x1e /* PF_??? */, SOCK_SEQPACKET, 0) = 513
close(513) = 0
socket(PF_NETLINK, SOCK_DGRAM, 11) = 513
socket(PF_NETLINK, SOCK_DGRAM, 11) = 514
socket(PF_NETLINK, SOCK_DGRAM, 11) = 515
socket(PF_NETLINK, SOCK_DGRAM, 11) = 516
socket(0x1e /* PF_??? */, SOCK_SEQPACKET, 0) = 517
close(517) = 0
socket(PF_NETLINK, SOCK_DGRAM, 11) = 517
socket(PF_NETLINK, SOCK_DGRAM, 11) = 518
我的问题是,我如何才能找出运行进程的哪个函数创建了这个PF_NETLINK套接字?代码太大,无法手动遵循所有可能的路径。是否有任何工具可以告诉我哪个函数创建了这些PF_NETLINK套接字?
任何帮助都是感激的。
许多谢谢。使用strace+和普通strace选项来跟踪socket()系统调用。它应该为您提供一个堆栈跟踪到执行调用的源代码行。使用步骤如下:http://code.google.com/p/strace-plus/
在调试器下运行,并在socket()
中设置断点。当遇到断点时,执行堆栈跟踪。
相关文章:
- 接受线程 C++ 套接字中的函数循环
- 如何在类中封装C/C++套接字发送和接收函数?
- 为什么套接字中的 recv() 函数不返回任何内容?
- C++中TCP套接字的recv函数
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- 套接字 read() 函数在处理隧道时有时从不返回 0
- 如何将函数<void()>写入管道/套接字对?
- 此函数是否对套接字有问题?
- 其中是升压套接字的函数读取
- 为什么 fcntl() 标志值以八进制格式定义,以及此函数如何用于阻塞/非阻塞套接字?
- 套接字:我的select()函数逻辑有未定义的行为
- 套接字错误 gcc 无法在 WinSock2.h 中获取函数
- 是否可以将套接字设置为仅针对recv()函数的非阻塞套接字
- 套接字读取()到一个在C++中返回指针的函数中
- 是否可以通过套接字发送指向函数的指针
- 从安卓客户端发送数据时,C++ 套接字接收函数中第一个字符中的 NUL 值
- 套接字不能用作函数
- 在 c++ 中通过套接字发送图片(发送函数),但未收到完整(Windows)
- 编译使用 libcxx 的套接字函数 bind() 的代码失败
- 正在获取套接字函数的连接超时