Для этого можно использовать 2 низкоуровневых инструмента: strace
и gdb
. Доступность strace
предполагает, что вы используете Linux или ОС, в которой он работает. Для других ОС у вас может быть truss
или dtrace
, но методика аналогична.
Итак, strace
проще в использовании, чем gdb
, и обычно отлично отвечает на вопрос «что делает это приложение». Типичное использование (для меня) будет примерно таким:
strace -f -tt -s 200 -p $PID
Единственный реальный вариант, который вам нужен, - это -p $ PID
. Другие параметры просто добавляют дополнительную информацию в строку вывода, но в действительности они не нужны.
Это показывает каждый системный вызов, выполняемый приложением. Единственный способ, которым приложение может что-то делать, а strace
не показывает этого, - это чисто вычислительные операции. Имеется в виду хрустящие числа или что-то в этом роде. Такие вещи, как чтение / запись файла, отправка пакета, получение текущего времени и т. Д., Требуют системного вызова и будут отображаться.
gdb
является более низким уровнем, чем strace
. gdb
покажет вам, какая строка кода на самом деле выполняется приложением.Однако здесь есть несколько подводных камней. Важным является то, что вам нужны отладочные символы для приложения. В пакетах, предоставляемых дистрибутивом, они обычно были удалены. Однако в таких дистрибутивах, как производные от RedHat, они часто предоставляются в виде pkgfoo-debuginfo-1.2.3.rpm
. Вы можете просто установить этот пакет и вернуть символы.
Другое дело, что где strace
покажет вам, что приложение делает с течением времени, gdb
покажет вам, что приложение работает именно в этот момент, так как замораживает процесс, пока вы его проверяете.
Так или иначе, использование выглядит так:
gdb -p $PID
... что приведет вас к интерактивной оболочке, где вы можете запустить что-то вроде:
where
или
info threads
Я не буду вдаваться в подробности того, как использовать gdb
, так как в зависимости от сложности вашего приложения это может быть сложно, и в Интернете есть множество руководств.
Когда вы закончите копаться в процессе и захотите, чтобы он продолжился, просто используйте quit
или CTRL + D .