Если я наберу «layout src», он скажет «Нет доступного источника»
Вы всегда можете использовать layout reg
, чтобы показать регистры + разборка . Тогда вам не нужно заботиться о вашем ассемблере + компоновщике, включая номера строк, только символы для ваших меток. (Символы помогают GDB знать, с чего начать разборку, когда вы остановились на инструкции, которая не является первой после метки. Машинный код x86 не может быть однозначно декодирован назад).
Единственная причина, по которой выВы хотите, чтобы исходные строки видели ваши комментарии, но обычно у вас есть редактор в другом окне, и для небольшого цикла или блока вы знаете, что вы ожидаете. Эти комментарии позволят вам быстрее представить эту картинку в голову, когда вы какое-то время отсутствовали в коде, а не так много, когда вы только что написали / все еще работаете над ней. Но если вам нужно напоминание о том, что должно быть в каком регистре в определенный момент, вы можете просто перейти к источнику в вашем редакторе.
Разборка часто более полезна, чем источник. И это исключает классы ошибок, такие как макроопределение, которое не работает так, как вы думали, или опечатка, которая становится очевидной после сборки + разборки.
Использование si
и ni
для одношаговогоинструкциями, а не исходными строками.
b *0x1234
устанавливает точку останова по числовому адресу (который вы можете скопировать / вставить из разборки), или просто пошагово туда, где вы хотите установить точку останова и использовать b
Там.
См. также нижнюю часть тега x86 вики для получения дополнительных советов по отладке asm. Особенно используйте strace
для любого кода, который выполняет системные вызовы.
as max.s -g -o max.o && ld max.o -g -o max
Вы можете сделать это одной командой: gcc -nostdlib -static -g max.s -o max
. Вы можете или не можете найти это проще. Но если у вас есть что-то, что может быть собрано как 32- или 64-битное, удобно добавить один -m32
вместо добавления различных опций для as
и ld
. Или, если вы хотите вызвать ту же команду и использовать ее в другом исходном файле, max.s
появляется только один раз. Самым большим преимуществом является то, что если вы хотите написать тестовый набор C для вашей функции asm, gcc -no-pie -fno-pie foo.c foo.S
Just Works.
(лично я обычно пропускаю часть -o max
и просто отлаживаю gdb ./a.out
. Но этоможно перепутать, из какого источника получен ваш a.out
.