I am trying to debug a process that hangs, the output of strace for the process id has last line :
recvfrom(9, <detached ...>
From this what I understand that the process is waiting on the socket.
But I don’t know which or what kind of socket is this. How can I discover more about this ? does the file descriptor 9 will give me more information ? How can I use this file discover to know more about what it is waiting for ?
its a python process, running in linux.
Since you are using
strace I assume you are on Linux and you know the process id. In that case you can find a lot of info in
/proc. Here is an example of what to do.
ls -l /proc/<pid>/fd. There will be an entry corresponding to the fd you are interested in and that fd should be a socket as such:
$ ls -l /proc/3311/fd
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:
In the above example,
3 is the socket of interest. The number after
socket is the inode number,
23182 in this case.
Now look in the file
/proc/net/tcp to find that 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
The first line of
/proc/net/tcp tells you what each field represents:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
So in this example, the remote address is
8EDC3AD8:0050. That’s the ip_addres:port_number in hex and network byte ordering. If you convert that to decimal it is
Which tells you it is in fact a TCP connection to port 80 of google.com!
If you don’t find the inode number in
/proc/net/tcp then try the other protocols in the directory, probably
Look earlier in the
strace output for when the file descriptor was returned from
open() (or perhaps
socket()), there you’ll see the additional arguments used in the call.