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

Принятие объектов содержит не “|”, и теги содержат не “”:

awk -F '[,|]' '{for(i=1;i<NF;i++)print$i$NF}' input.txt
45
07.11.2014, 07:06
5 ответов

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

 strace -s 99 -ffp 12345

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

Если вы настаиваете на том, чтобы получить Stacktrace, 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)
43
27.01.2020, 19:34

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

gdb -batch -ex bt -p 1234

Есть также Pshack (не стандартная утилита, вы, вероятно, должны быть установлены вручную). Похоже на эквивалент ProCStack AIX . Но на моем Debian Heezy AMD64, кажется, всегда ошибка. На I386 для программы, составленной без отладки символов, она не печатает никакого символа, даже из библиотек, для которых доступны символы отладки.

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

27
27.01.2020, 19:34

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

$ 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
33
27.01.2020, 19:34

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

1
27.01.2020, 19:34

Вы хотите eu-stackиз elfutils. Например,

$ sudo eu-stack -id -p $$
PID 9189 - process
TID 9189:
#0  0x00007fd36c69e687 __GI___waitpid
#1  0x000055ba004c0c19
#2  0x000055ba004c234b wait_for
#3  0x000055ba004b1b64 execute_command_internal
#4  0x000055ba004b1bf2 execute_command
#5  0x000055ba0049c274 reader_loop
#6  0x000055ba0049ac7f main
#7  0x00007fd36c5dbb97 __libc_start_main
#8  0x000055ba0049b54a _start

Для более сложных вещей можно написать один -вкладыш. Например, чтобы получить список всех стеков потоков для Google Chrome, можно сделать

sudo true
pidof chrome | sudo xargs -rn1 timeout 1s eu-stack -id -p

Параметр timeoutиспользуется для предотвращения остановки процессов в непрерывном спящем режиме. Установите тайм-аут дольше, если вы готовы ждать дольше, чтобы получить стек.

А если у вас загруженная система, в которой заблокированы только некоторые потоки или процессы, можно сделать снимок текущего состояния процессов, как показано здесь

sudo true
pidof apache2 | sort -n | sudo xargs -rn1 timeout 1s eu-stack -id -p > snap1
sleep 10s
pidof apache2 | sort -n | sudo xargs -rn1 timeout 1s eu-stack -id -p > snap2
diff -u snap1 snap2

и вы можете определить стеки, которые не изменились в течение 10 секунд. Если вы получаете ошибки, такие как

eu-stack: dwfl_linux_proc_report pid 25062: No such file or directory
eu-stack: dwfl_linux_proc_report pid 25068: Exec format error

это просто означает, что процесс 25062 завершился после того, как pidofперечислил его, но до тех пор, пока eu-stackне запросил его состояние, а процесс 25068 отключился одновременно с построением трассировки стека, и в результате построение стека не удалось при чтении исполняемого файла, указанного через файловую систему proc.

4
14.05.2020, 17:48

Теги

Похожие вопросы