如何找到打开套接字的功能?

时间:2013-06-01 08:33:35

标签: 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)      = 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套接字?

感谢任何帮助。

非常感谢。

2 个答案:

答案 0 :(得分:4)

使用strace +和普通strace选项来跟踪socket()系统调用。 它应该为您提供进行调用的源代码行的堆栈跟踪。 使用它的步骤如下: http://code.google.com/p/strace-plus/

答案 1 :(得分:1)

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