C++ 如何找到打开套接字的函数?
我有一个进程在一个系统中24*7运行。最近有报道称,此过程正在打开过多的插槽,耗尽其最大限制C++ 如何找到打开套接字的函数?,c++,c,linux,debugging,sockets,C++,C,Linux,Debugging,Sockets,我有一个进程在一个系统中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)
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套接字
感谢您的帮助
非常感谢。在调试器下运行它,并在
socket()
中设置断点。当断点到达时,进行堆栈跟踪。使用strace+和普通strace选项跟踪socket()系统调用。
它应该为您提供一个堆栈跟踪,以跟踪发出调用的源代码行。
使用它的步骤如下:
该命令是快速搜索大量文件的好命令。如果您使用的是IDE,那么它很可能还具有“搜索所有文件”功能。顺便说一句,我希望您不是经常以
root
身份登录?这是一个相当大的安全漏洞。取而代之的是考虑运行真正需要它的程序。EHR,不是空洞,但这是一个很大的安全风险。没有工具能在事实之后告诉你。gdb可能很幸运–在socket系统调用上设置一个跟踪点,并告诉gdb打印一个回溯跟踪,并在它到达跟踪点时继续。@thejb,是的,有:使用strace+。这绝对是太棒了,基本上是一个正常的strace,但是有回溯。strace+看起来真的很棒。但不幸的是,我的系统没有这个工具,所以无法使用它。我的错。但是非常感谢,因为我根本不知道这个工具。strace+不是预先打包的。您可以分4步安装。只需按照上面链接中的步骤进行操作。您的建议有效。GDB在调用socket()时打印了回溯。追踪时间很长,但幸运的是,我们能够找出问题所在。非常感谢。