Прочитайте выполняемые инструкции - PullRequest
1 голос
/ 10 января 2010

Как видно из заголовка, есть ли способ прочитать инструкции машинного кода как / после того, как они были выполнены? Например, если бы у меня был произвольный блок кода на C, и я хотел бы знать, какие инструкции были скомпилированы и выполнены при вводе этого блока, тогда был бы способ сделать это? Заранее благодарю за любые указатели на эту тему.

Редактировать: Некоторая мотивация в отношении того, что я пытаюсь сделать: я хочу иметь программу, которая примерно определяет, как она была скомпилирована или какие инструкции она выполняет в данный момент без необходимости знать как машинный код сделан. То есть Я хочу использовать тяжелую работу, которую некоторые компиляторы ранее выполняли при компиляции программы, чтобы я мог копировать, а затем использовать выполняемый машинный код.

Ответы [ 5 ]

2 голосов
/ 11 января 2010

Малоизвестный факт: в GDB встроен интерфейс curses.

Используйте gdbtui или gdb, Ctrl + X , Ctrl + A для введите, затем Ctrl + X , 2 , чтобы начать показ сборки и источника вместе. Текущая инструкция выделена, и вы можете перемещаться с помощью клавиш со стрелками.

1 голос
/ 10 января 2010

Я не могу сказать, спрашиваете ли вы об этом во время выполнения или хотите увидеть текстовый файл, содержащий код сборки вашего скомпилированного кода на языке С.

Если первое, просто используйте отладчик (используйте дизассемблирование в gdb с gcc или встроенный отладчик в Microsoft Visual Studio).

Если последнее, вам придется искать конкретные команды для вашего компилятора. Например, в Visual Studio просто используйте флаг /FAs; это выведет код сборки с вашим исходным кодом. Для gcc:

gcc -c -g -Wa,-a,-ad foo.c > foo.lst
1 голос
/ 10 января 2010

Почти каждый отладчик может сделать это.

Для gdb полезный трюк, который нужно запомнить: display/i $pc

Сделайте это один раз, а затем установите точку останова для функции, шагая через функцию с помощью stepi и nexti.

Инструкция на ПК будет автоматически отображаться каждый раз.

Ross-Harveys-MacBook-Pro:so ross$ cat > deb.c
int main(void) { return (long)main + 0x123; }
Ross-Harveys-MacBook-Pro:so ross$ cc -O deb.c
Ross-Harveys-MacBook-Pro:so ross$ gdb -q a.out
Reading symbols for shared libraries .. done
(gdb) break main
Breakpoint 1 at 0x100000f30
(gdb) display/i $pc
(gdb) r
Starting program: /Users/ross/so/a.out 
Reading symbols for shared libraries +. done

Breakpoint 1, 0x0000000100000f30 in main ()
1: x/i $pc  0x100000f30 <main+4>:   lea    -0xb(%rip),%rax        # 0x100000f2c <main>
(gdb) stepi
0x0000000100000f37 in main ()
1: x/i $pc  0x100000f37 <main+11>:  add    $0x123,%eax
(gdb) stepi
0x0000000100000f3c in main ()
1: x/i $pc  0x100000f3c <main+16>:  leaveq 
0 голосов
/ 10 января 2010

Если вы хотите знать, каким был путь выполнения для конкретной функции, возможно, некоторые процессоры имеют такую ​​функцию, но обычно нет. Теперь, что вы можете сделать, это запустить в эмуляторе и изменить эмулятор, чтобы распечатать адреса выборок, чтений или чего-либо еще.

Если это просто вопрос дизассемблирования с использованием gcc / binutils tools objdump -D filename> out.list и не надо выполнять или использовать отладчик

0 голосов
/ 10 января 2010

У большинства отладчиков есть опции для просмотра разборки кода, который вы выполняете.

Пример: в GDB использовать команду дизассемблирования.

...