Отладка тайм-аутов соединения с использованием strace?

Я пытаюсь выяснить, почему вращается "Затмение", поэтому я решил запустить "Стрейс".

Я нашел процесс затмения, используя:

$ ps ax | grep java
 5546 ?        Sl    19:04 /usr/bin/java ... [arguments omitted]

Запустив strace в этом процессе я вижу, что он ожидает другого процесса:

$ sudo strace -p 5546
Process 5546 attached - interrupt to quit
futex(0x7f6c416679d0, FUTEX_WAIT, 5547, NULL^C <unfinished ...>
Process 5546 detached

Интересно, что процесс 5547 не появляется в ps (кто-нибудь может сказать мне, почему?), но я могу strace Это. Он многократно выплевывает множество неудач EAGAIN (со случайным успехом)

read(16, 0x7f6c41664d10, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {67410, 357843264}) = 0
poll([{fd=16, events=POLLIN}, {fd=15, events=POLLIN}, {fd=68, events=POLLIN}, {fd=128, events=POLLIN}, {fd=69, events=POLLIN}], 5, 0) = 0 (Timeout)
read(16, 0x7f6c41664cb0, 16)            = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(15, 0x7f6c3815f2e4, 4096, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
...

Судя по выводу, похоже, что он опрашивает файловые дескрипторы 16, 15, 68, 128 и 69. В частности, EAGAIN ошибки приходят от 15 и 6 FDS, как видно из read(2) а также recvfrom(2) звонки.

Как мне найти больше информации об этих FDS? Я старался lsof -p 5547 но вывод не печатается. Я подозреваю, что это сокеты, которые открыты для какого-то сайта, но почему он вращается в тесной петле с EAGAIN неудачи озадачивают...

2 ответа

Решение

Некоторые PID не указаны в списке, потому что они принадлежат потокам. htop может показать их, если вы нажмете Shift + H (и необязательно T для просмотра в виде дерева), но lsof хочет PID основного процесса. (Во всяком случае, все pthreads в процессе совместно используют файловые дескрипторы.) Вы также можете посмотреть в /proc/5546/fd/ а также /proc/5546/task/,

EAGAIN является нормальным для неблокирующего ввода / вывода; например, он возвращается read() когда нет данных для чтения. Смотрите "ОШИБКИ" в read (2), write (2) и так далее. Некоторые из этих fd, скорее всего, являются соединениями с сервером X11 - неблокирующие операции ввода-вывода используются клиентскими библиотеками X11.

Третий параметр futex(2) не обязательно идентификатор процесса, руководство говорит, что это futex(uaddr, op, val, timeout, ...)и что если оп FUTEX_WAIT, он "атомарно проверяет, что адрес futex uaddr по- прежнему содержит значение val, и спит в ожидании FUTEX_WAKE для этого адреса futex. [Когда] время ожидания равно NULL, вызов блокируется на неопределенный срок".

В вашем случае это звучит так, как будто процесс 5546 сидел там в ожидании чего-то - предположительно его потока 5547 или чего-то связанного, но мы не можем точно знать, что точно, основываясь только на этом - записать это число в указанную память адрес.

Обратите внимание, что вы можете видеть темы, используя ps -eLf или похожие.

Другие вопросы по тегам