如何找到有关文件描述符的更多信息?
How to find more information about the file descriptor?
我正在尝试调试挂起的进程,进程 ID 的 strace 输出有最后一行:
recvfrom(9, <detached ...>
据此我了解到该进程正在等待套接字。
但是我不知道这是什么插座。我怎样才能发现更多关于这个的信息?文件描述符 9 会给我更多信息吗?我怎样才能使用这个文件 discover 来更多地了解它在等待什么?
它是一个 python 进程,运行 在 linux。
查看前面的 strace
输出,了解文件描述符何时从 open()
(或者可能 socket()
)返回,您会看到调用中使用的附加参数.
由于您使用的是 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
。
我正在尝试调试挂起的进程,进程 ID 的 strace 输出有最后一行:
recvfrom(9, <detached ...>
据此我了解到该进程正在等待套接字。
但是我不知道这是什么插座。我怎样才能发现更多关于这个的信息?文件描述符 9 会给我更多信息吗?我怎样才能使用这个文件 discover 来更多地了解它在等待什么?
它是一个 python 进程,运行 在 linux。
查看前面的 strace
输出,了解文件描述符何时从 open()
(或者可能 socket()
)返回,您会看到调用中使用的附加参数.
由于您使用的是 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
。