Як знати, де програма застрягла в 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

6
ПРИМІТКА: per 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частина працює у багатьох Уніках, але не завжди (часто) корисна сама по собі).
Stéphane Chazelas

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
Pavan Manjunath

@PavanManjunath, pstackздається, зламаний на amd64, я спостерігаю те саме на Debian wheezy amd64.
Жил 'SO- перестань бути злим'

1
README pstack каже, що це лише для 32-бітових, ELF, x86, GNU.
Стефан Шазелас

1

pstackнадрукує трасування стека запущеного процесу для вас. gstackє загальним еквівалентом, якщо pstackвін недоступний / не підтримує ваш дистрибутив / арку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.