Просмотр кода сборки и кода C - PullRequest
36 голосов
/ 02 апреля 2012

Есть ли у нас способ просмотра ассемблера и кода на c, используя gdb.

disassemble имя_функции показывает только сборку, я пытался найти способ легко сопоставить код c сборке.Спасибо

Ответы [ 3 ]

47 голосов
/ 02 апреля 2012

Вы можете запустить GDB в Текстовый интерфейс пользователя (TUI) режим:

gdb -tui <your-binary>
(gdb) b main
(gdb) r
(gdb) layout split

Команда layout split делит окно на две части - одна из них отображает исходный код, а другая - соответствующую сборку. Несколько других трюков:

  • набор disassembly-flavor intel - если вы предпочитаете нотацию intel
  • set print asm-demangle - разделение имен C ++ в представлении сборки
  • ni - следующая инструкция
  • si - пошаговая инструкция

Если вы не хотите использовать режим TUI (например, вашему терминалу это не нравится), вы всегда можете сделать:

x /12i $pc

, что означает печать 12 инструкций с адреса счетчика текущей программы - это также работает с указанными выше приемами (разбор, пошаговые инструкции и т. Д.).

Трюк "x / 12i $ pc" работает как в gdb, так и в cgdb, тогда как "разбивка по макету" работает только в gdb.

Наслаждайтесь:)

28 голосов
/ 09 апреля 2012

Попробуйте disassemble /m.

См. http://sourceware.org/gdb/current/onlinedocs/gdb/Machine-Code.html#Machine-Code

Формат схож с форматом objdump -S и смешивает источник с разборкой. Пример выходной выдержки:

10      int i = 0;
=> 0x0000000000400536 <+9>: movl   $0x0,-0x14(%rbp)

11      while (1) {
12          i++;
   0x000000000040053d <+16>:    addl   $0x1,-0x14(%rbp)
5 голосов
/ 24 января 2014

Для вашей цели попробуйте

objdump -S <your_object_file>

от man objdump:

-S
--source
 Display source code intermixed with disassembly, if possible.
 Implies -d.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...