我正在尝试调试挂起的进程,进程id的strace输出有最后一行:
recvfrom(9, <detached ...>
据我所知,该过程正在等待套接字。
但我不知道这是什么类型的插座。我怎样才能发现更多这方面的内容?文件描述符9会给我更多信息吗?如何使用此文件发现了解更多有关它的内容?
它是一个在Linux中运行的python进程。
答案 0 :(得分:1)
在strace
输出中查看从open()
(或者socket()
)返回文件描述符的时间,您将看到调用中使用的其他参数。 / p>
答案 1 :(得分:1)
由于您使用的是strace
,我假设您使用的是Linux,并且您知道进程ID。在这种情况下,您可以在/proc
中找到大量信息。这是一个做什么的例子。
ls -l /proc/<pid>/fd
。将有一个对应于您感兴趣的fd的条目,并且fd应该是一个套接字:
$ ls -l /proc/3311/fd
total 0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 0 -> /dev/pts/0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 1 -> /dev/pts/0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 2 -> /dev/pts/0
lrwx------ 1 alanau alanau 64 Sep 24 20:37 3 -> socket:[23182]
在上面的示例中,3
是感兴趣的套接字。 socket
之后的数字是inode编号,在这种情况下为23182
。
现在查看文件/proc/net/tcp
以找到inode:
$ cat /proc/net/tcp | grep 23182
2: 0F02000A:C43B 8EDC3AD8:0050 01 00000000:00000000 00:00000000 00000000 1000 0 **23182** 1 0000000000000000 23 0 0 10 -1
/proc/net/tcp
的第一行告诉您每个字段代表什么:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
因此,在此示例中,远程地址为8EDC3AD8:0050
。这是以十六进制和网络字节顺序排列的ip_addres:port_number。如果将其转换为十进制,则为216.58.220.142:80
。
这告诉你它实际上是google.com端口80的TCP连接!
如果您未在/proc/net/tcp
中找到inode编号,请尝试目录中的其他协议,可能是/proc/net/udp
。