C++ 如何找到打开套接字的函数?

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)

我有一个进程在一个系统中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套接字

感谢您的帮助


非常感谢。

在调试器下运行它,并在
socket()
中设置断点。当断点到达时,进行堆栈跟踪。

使用strace+和普通strace选项跟踪socket()系统调用。 它应该为您提供一个堆栈跟踪,以跟踪发出调用的源代码行。 使用它的步骤如下:

该命令是快速搜索大量文件的好命令。如果您使用的是IDE,那么它很可能还具有“搜索所有文件”功能。顺便说一句,我希望您不是经常以
root
身份登录?这是一个相当大的安全漏洞。取而代之的是考虑运行真正需要它的程序。EHR,不是空洞,但这是一个很大的安全风险。没有工具能在事实之后告诉你。gdb可能很幸运–在socket系统调用上设置一个跟踪点,并告诉gdb打印一个回溯跟踪,并在它到达跟踪点时继续。@thejb,是的,有:使用strace+。这绝对是太棒了,基本上是一个正常的strace,但是有回溯。strace+看起来真的很棒。但不幸的是,我的系统没有这个工具,所以无法使用它。我的错。但是非常感谢,因为我根本不知道这个工具。strace+不是预先打包的。您可以分4步安装。只需按照上面链接中的步骤进行操作。您的建议有效。GDB在调用socket()时打印了回溯。追踪时间很长,但幸运的是,我们能够找出问题所在。非常感谢。