Как определить, какие инструкции выполняет процесс?

8

Я знаю о strace и ltrace, но это говорит только о том, что системные вызовы и вызовы библиотек выполняет процесс, соответственно. Я хотел бы точно знать, какие инструкции выполняет процесс. Либо сборка, либо какая-то золотая середина между С и сборкой, если это возможно. Предполагая, что двоичный файл не был скомпилирован с символами отладки, так что склонность к первому варианту как можно более вероятна.

Вариант использования: кажется, что процесс завис, без вывода данных из strace или ltrace. Определите, делает ли процесс «что-то». Я понимаю, что это может быть трудно определить, так как я представляю, что это аналогично решению проблемы остановки. Тем не менее, возможно, будет возможно собрать полезные данные.

Второй вариант использования: любопытство. Было бы интересно сбросить весь список инструкций по сборке в текстовый список.

Я предполагаю, что я могу использовать gdb для этого, но не уверен, как это сделать, поскольку речь идет не об отладке написанной мною программы, а об использовании gdb для проверки работоспособности запущенного процесса.

ОС CentOS 6.

кошачьи штаны
источник
Я вполне уверен, что вы можете отлаживать ваш процесс в исполнении с помощью gdbили ddd. Даже в сборке и без отладочных символов.
Валмики Аркиссандас
Связанный: stackoverflow.com/questions/2971926/…
Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功

Ответы:

10

Вы можете сделать это с помощью gdb: команд niи siзапустить одну инструкцию за раз. Команда nзапускает следующую строку кода, для большинства значений «next». Для n(и соответствующего s) вы должны скомпилировать так, чтобы символы отладки появлялись в исполняемом файле.

Этот ответ на стековый поток дает несколько способов сделать это более или менее визуально.

Команда gdb: display/i $pcпоказывает инструкцию перед ее выполнением. display $pcпоказать строку кода bfore nили sвыполнить ее.

Брюс Эдигер
источник
Используйте gdb -p <pid>для прикрепления к процессу.
Анхель
6

Запустите ps -lидентификатор процесса и проверьте Sстолбец («состояние»). Если это состояние R, то ваш процесс выполняет код. Если процесс остается в состоянии Rи straceне показывает, что он выполняет какой-либо системный вызов, то процесс задерживается на очень длительные, возможно, бесконечные вычисления. Если процесс находится и остается в состоянии D, то он блокируется при системном вызове. Для получения дополнительной информации о состояниях процесса см. Что указывает STAT этого процесса? На что указывает состояние «прерывистый сон»? и что, если 'kill -9' не работает? ,

Если процесс выполняет длительные вычисления, вы можете использовать Gdb (или другой отладчик), чтобы посмотреть, что он делает. Если исполняемому файлу не хватает отладочной информации (что обычно бывает, если вы специально для этого не компилировали программу), тогда отладчик сможет показывать только машинные инструкции; если исполняемый файл содержит отладочную информацию, вы сможете увидеть имена функций в следах стека и так далее. Чтобы присоединить Gdb к процессу, запустите, gdb /path/to/executable 1234где 1234находится идентификатор процесса. Команда sпозволяет выполнять инструкции по одной за раз. Если вы не программист и не знакомы с тем, что должна делать программа, есть небольшой шанс, что в этом сценарии вы получите полезную информацию из Gdb.

Жиль "ТАК - перестань быть злым"
источник