Ответ 1
Вы можете использовать stepi
или nexti
(который может быть сокращен до si
или ni
) для перехода через ваш машинный код.
Я за пределами исполняемого файла gdb, и у меня даже нет стека, который соответствует этой цели. Я все равно хочу сделать одноэтапный шаг, чтобы я мог проверить, что происходит в моем ассемблере, потому что я не эксперт в сборке x86. К сожалению, gdb отказывается выполнять эту простую отладку на уровне сборки. Это позволяет мне устанавливать и останавливать соответствующую точку останова, но как только я пытаюсь выполнить однократный шаг вперед, gdb сообщает об ошибке "Невозможно найти ограничения текущей функции", и EIP не изменяется.
Дополнительная информация:
Машинный код был сгенерирован операторами gcc asm, и я скопировал его в ячейку памяти ядра, где она выполняется, из вывода objdump -d. Я бы не прочь использовать простой способ использовать загрузчик для загрузки моего объектного кода на перемещенный адрес, но помните, что загрузка должна выполняться в модуле ядра.
Я полагаю, что другой альтернативой было бы создание фальшивого модуля ядра или файла информации об отладке, чтобы дать gdb, чтобы заставить его полагать, что эта область находится в программном коде. gdb отлично работает на самом исполняемом ядре.
(Для тех, кто действительно хочет знать, я вставляю код во время выполнения в пространство данных ядра Linux внутри VMware VM и отлаживаю его из удаленной отладки gdb с помощью встроенной в VMware Workstation заглушки gdb. не писать ядровые эксплоиты, я аспирант безопасности, пишущий прототип.)
(Я могу установить точку останова для каждой команды внутри моей сборки.Это работает, но будет довольно трудоемкой через некоторое время, так как размер инструкций сборки x86 меняется и расположение сборки будет меняться каждый раз, когда я перезагружу.)
Вы можете использовать stepi
или nexti
(который может быть сокращен до si
или ni
) для перехода через ваш машинный код.
Вместо gdb
запустите gdbtui
. Или запустите gdb
с помощью переключателя -tui
. Или нажмите C-x C-a после ввода gdb
. Теперь вы находитесь в режиме GDB TUI.
Введите layout asm
, чтобы сделать сборку верхнего окна - это будет автоматически следовать указателю вашей команды, хотя вы также можете менять кадры или прокручивать их во время отладки. Нажмите C-x s, чтобы войти в режим SingleKey, где run continue up down finish
и т.д. Сокращены до одного ключа, что позволяет вам быстро пройтись по вашей программе.
+---------------------------------------------------------------------------+ B+>|0x402670 <main> push %r15 | |0x402672 <main+2> mov %edi,%r15d | |0x402675 <main+5> push %r14 | |0x402677 <main+7> push %r13 | |0x402679 <main+9> mov %rsi,%r13 | |0x40267c <main+12> push %r12 | |0x40267e <main+14> push %rbp | |0x40267f <main+15> push %rbx | |0x402680 <main+16> sub $0x438,%rsp | |0x402687 <main+23> mov (%rsi),%rdi | |0x40268a <main+26> movq $0x402a10,0x400(%rsp) | |0x402696 <main+38> movq $0x0,0x408(%rsp) | |0x4026a2 <main+50> movq $0x402510,0x410(%rsp) | +---------------------------------------------------------------------------+ child process 21518 In: main Line: ?? PC: 0x402670 (gdb) file /opt/j64-602/bin/jconsole Reading symbols from /opt/j64-602/bin/jconsole...done. (no debugging symbols found)...done. (gdb) layout asm (gdb) start (gdb)
Самая полезная вещь, которую вы можете сделать здесь, - это display/i $pc
, прежде чем использовать stepi
, как уже было сказано в ответе R Samuel Klatchko. Это говорит gdb, чтобы разобрать текущую инструкцию непосредственно перед печатью запроса каждый раз; то вы можете просто нажать Enter, чтобы повторить команду stepi
.
(см. мой ответ на другой вопрос более подробно - контекст этого вопроса был другим, но принцип тот же.)