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

How to find which function opened the socket?

本文关键字:套接字 函数 何找      更新时间:2023-10-16

我有一个进程在一个系统中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()中设置断点。当遇到断点时,执行堆栈跟踪。