Я знаю о strace и ltrace, но это говорит только о том, что системные вызовы и вызовы библиотек выполняет процесс, соответственно. Я хотел бы точно знать, какие инструкции выполняет процесс. Либо сборка, либо какая-то золотая середина между С и сборкой, если это возможно. Предполагая, что двоичный файл не был скомпилирован с символами отладки, так что склонность к первому варианту как можно более вероятна.
Вариант использования: кажется, что процесс завис, без вывода данных из strace или ltrace. Определите, делает ли процесс «что-то». Я понимаю, что это может быть трудно определить, так как я представляю, что это аналогично решению проблемы остановки. Тем не менее, возможно, будет возможно собрать полезные данные.
Второй вариант использования: любопытство. Было бы интересно сбросить весь список инструкций по сборке в текстовый список.
Я предполагаю, что я могу использовать gdb для этого, но не уверен, как это сделать, поскольку речь идет не об отладке написанной мною программы, а об использовании gdb для проверки работоспособности запущенного процесса.
ОС CentOS 6.
gdb
илиddd
. Даже в сборке и без отладочных символов.Ответы:
Вы можете сделать это с помощью
gdb
: командni
иsi
запустить одну инструкцию за раз. Командаn
запускает следующую строку кода, для большинства значений «next». Дляn
(и соответствующегоs
) вы должны скомпилировать так, чтобы символы отладки появлялись в исполняемом файле.Этот ответ на стековый поток дает несколько способов сделать это более или менее визуально.
Команда
gdb
:display/i $pc
показывает инструкцию перед ее выполнением.display $pc
показать строку кода bforen
илиs
выполнить ее.источник
gdb -p <pid>
для прикрепления к процессу.Запустите
ps -l
идентификатор процесса и проверьтеS
столбец («состояние»). Если это состояниеR
, то ваш процесс выполняет код. Если процесс остается в состоянииR
иstrace
не показывает, что он выполняет какой-либо системный вызов, то процесс задерживается на очень длительные, возможно, бесконечные вычисления. Если процесс находится и остается в состоянииD
, то он блокируется при системном вызове. Для получения дополнительной информации о состояниях процесса см. Что указывает STAT этого процесса? На что указывает состояние «прерывистый сон»? и что, если 'kill -9' не работает? ,Если процесс выполняет длительные вычисления, вы можете использовать Gdb (или другой отладчик), чтобы посмотреть, что он делает. Если исполняемому файлу не хватает отладочной информации (что обычно бывает, если вы специально для этого не компилировали программу), тогда отладчик сможет показывать только машинные инструкции; если исполняемый файл содержит отладочную информацию, вы сможете увидеть имена функций в следах стека и так далее. Чтобы присоединить Gdb к процессу, запустите,
gdb /path/to/executable 1234
где1234
находится идентификатор процесса. Командаs
позволяет выполнять инструкции по одной за раз. Если вы не программист и не знакомы с тем, что должна делать программа, есть небольшой шанс, что в этом сценарии вы получите полезную информацию из Gdb.источник