Как узнать, где программа застряла в Linux?

44

Я выполняю следующую команду на моем сервере Ubuntu

root@slot13:~# lxc-stop --name pavan --logfile=test1.txt --logpriority=trace

Кажется, висит бесконечно. Всякий раз, когда это происходило в AIX, я просто получал PID процесса-нарушителя и говорил:

$ procstack <pid_of_stuck_process>

и раньше он показывал весь стек вызовов этого процесса. Есть ли эквивалент procstackв Linux / Ubuntu?

Паван Манджунатх
источник

Ответы:

43

Моим первым шагом было бы запустить процесс, лучше всего

 strace -s 99 -ffp 12345

если ваш идентификатор процесса - 12345. Это покажет вам все системные вызовы, которые выполняет программа. Как протянуть процесс говорит вам больше.

Если вы настаиваете на получении трассировки стека, Google сообщает мне, что эквивалентен pstack. Но так как он не установлен, я использую gdb:

 tweedleburg:~ # sleep 3600 &
 [2] 2621
 tweedleburg:~ # gdb
 (gdb) attach 2621
 (gdb) bt
 #0  0x00007feda374e6b0 in __nanosleep_nocancel () from /lib64/libc.so.6
 #1  0x0000000000403ee7 in ?? ()
 #2  0x0000000000403d70 in ?? ()
 #3  0x000000000040185d in ?? ()
 #4  0x00007feda36b8b05 in __libc_start_main () from /lib64/libc.so.6
 #5  0x0000000000401969 in ?? ()
 (gdb)
Торстен Стэрк
источник
33

Два ответа были даны для поиска трассировки стека программы (не забудьте сначала установить символы отладки!). Если вы хотите выяснить, где застрял системный вызов, проверьте /proc/PID/stack, в каком списке находится стек ядра. Пример:

$ cat /proc/self/stack
[<ffffffff81012b72>] save_stack_trace_tsk+0x22/0x40
[<ffffffff81213abe>] proc_pid_stack+0x8e/0xe0
[<ffffffff81214960>] proc_single_show+0x50/0x90
[<ffffffff811cd970>] seq_read+0xe0/0x3e0
[<ffffffff811a6a84>] vfs_read+0x94/0x180
[<ffffffff811a7729>] SyS_read+0x49/0xb0
[<ffffffff81623ad2>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff
Lekensteyn
источник
6
ПРИМЕЧАНИЕ: для man7.org/linux/man-pages/man5/proc.5.html ... "/ proc / [pid] / stack (начиная с Linux 2.6.29) Этот файл обеспечивает символическую трассировку вызовов функций в стек ядра этого процесса. Этот файл предоставляется только в том случае, если ядро ​​было собрано с параметром конфигурации CONFIG_STACKTRACE. "
DocSalvager
Также обратите внимание, что доступ к этому файлу ограничен суперпользователем или самим процессом (по крайней мере, в системах, которые я пробовал).
Стефан Шазелас
Смотрите также /proc/pid/wchanи WCHANстолбец в ps -lвыводе или ps -o wchanдля верхней части этого стека. (эта psчасть работает во многих Unices, но не всегда (часто) полезна сама по себе).
Стефан Шазелас
27

В большинстве систем Unix вы можете использовать GDB .

gdb -batch -ex bt -p 1234

Там также pstack(не стандартная утилита, вам, вероятно, придется установить ее вручную). Это выглядит как эквивалент AIX procstack. Но на моем Debian wheezy amd64 он, похоже, всегда выдает ошибку. На i386 для программы, скомпилированной без отладочных символов, она не печатает никаких символов, даже из библиотек, для которых доступны отладочные символы.

Вы также можете использовать strace -p1234для просмотра системных вызовов, выполняемых процессом.

Жиль "ТАК - перестань быть злым"
источник
1
pstackКажется, выдает ошибки каждый раз. Нечто подобноеroot@sarai:~# pstack 6312 6312: /usr/bin/python /usr/bin/twistd -n --uid=maas --gid=maas --pidfile=/run/maas-pserv.pid --logfile=/dev/null maas-pserv --conf... (No symbols found) crawl: Input/output error Error tracing through process 6312
Паван Манджунат
@PavanManjunath, pstackпохоже, не работает на amd64, я наблюдаю то же самое на Debian wheezy amd64.
Жиль "ТАК - перестань быть злым"
1
README от pstack говорит, что это только для 32- битных , ELF, x86, GNU.
Стефан Шазелас
1

pstackвыведет для вас трассировку стека запущенного процесса. gstackявляется общим эквивалентом, если pstackон недоступен / не поддерживает ваш дистрибутив / архив.

Филипп Шантрёй
источник