2015-09-24 10 views
0

Я пытаюсь отладить процесс, который зависает, вывод strace для идентификатора процесса имеет последнюю строку:
recvfrom(9, <detached ...> От этого я понимаю, что процесс ожидает в сокете.Как найти дополнительную информацию о дескрипторе файла?

Но я не знаю, какой или какой сокет это. Как я могу узнать больше об этом? дескриптор файла 9 даст мне больше информации? Как я могу использовать этот файл, чтобы узнать больше о том, чего он ждет?

его процесс python, работающий в Linux.

+0

Какая операционная система? – fuz

+0

Является ли это Python или C? Почему добавили оба тега? – Olaf

+0

Его процесс python работает в Linux. Обновлен вопрос. –

ответ

1

Поскольку вы используете strace Предполагаете, что вы находитесь на Linux, и вы знаете идентификатор процесса. В этом случае вы можете найти много информации в /proc. Вот пример того, что делать.

Do ls -l /proc/<pid>/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 найти этот инод:

$ 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.

Который говорит вам, что это на самом деле TCP-соединение с портом 80 google.com!

Если вы не нашли номер inode в /proc/net/tcp, попробуйте другие протоколы в каталоге, возможно /proc/net/udp.

1

Посмотрите ранее в strace выходе, когда дескриптор файла был возвращен из open() (или, возможно, socket()), там вы увидите дополнительные аргументы, используемые при вызове.

Смежные вопросы