2016-02-02 4 views
0

Я знаком с DEBUG.COM от DOS. Я только что получил необходимость использовать gdb, но я застрял. Я уверен, что gdb является гораздо более универсальным и мощным, но мне просто нужно быстро выполнить кусок кода (не генерируемый каким-либо конкретным языком) и с хорошей видимостью регистров и выбранных мест памяти. Каковы gdb эквивалент DEBUG-х:руководство для gdb для пользователя DEBUG

U - unassemble (from select memory location) 
D - dump 
R - shows (selected) registers 
T - executes instruction at current IP 
P - step over 

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

ответ

1

Я не знаю DEBUG, но, возможно, я могу помочь с вашими вопросами gdb. Вы, вероятно, лучше всего читаете учебник gdb. Также вы можете увидеть более подробную информацию для любой команды, используя команду gdb help, например, help disassemble.

Ваши вопросы, похоже, сосредоточены на низкоуровневой сборке. gdb - многоуровневый отладчик, под которым я имею в виду, что он может работать на разных уровнях; Я бы сказал, что в принципе это отладчик исходного уровня, но он также может нормально функционировать на уровне сборки.

  • unassemble. Вероятно, эквивалент gdb - disassemble.

  • dump. Я не знаю, что это делает. Если он сбрасывает память, вам нужна команда gdb x.

  • R. Попробуйте info regs, или вы можете распечатать только выбранный регистр, используя имя, например print $rax.

  • T. Чтобы выполнить команду с одной сборкой, si.

  • P. См. Команду gdb ni.

Для первой инструкции вам нужно знать некоторые детали о платформе. В Linux первая инструкция находится на _start, так что вы бы break *_start.

+0

Теперь я отлаживаю двоичный код C. 'si' будет упрямо выполнять каждый оператор источника C, а не текущую машинную команду. Как переключиться на выполнение машинной команды? –

+0

'si' делает только один шаг на уровне инструкции; это просто, что gdb печатает текущую строку источника с каждым шагом. Я не думаю, что это может быть отключено, но вы можете сделать так же, как и инструкцию, с помощью 'display/i $ pc'. –