Как войти, перейти и выйти с GDB?


42

Я печатал, helpпока был в GDB, но ничего не нашел о переходе, переходе и выходе. Я поставил точку останова в программе сборки в _start( break _start). После этого я набрал текст, nextи он закончил отладку. Я предполагаю, что это было, потому что это закончилось _startи не вступило в действие, как я хотел.

Кто-нибудь, кто может помочь?


Прочитайте полные документы GDB. Насколько я помню, они мне очень помогли, когда я впервые узнал об этом. К сожалению, мне не нужно было отлаживать какие-либо программы на этом уровне в течение нескольких десятилетий, поэтому реальные команды, похоже, оказались в моем мозгу. Поэтому я не могу написать ответ. Но, если вы поймете это из руководств, то вы можете ответить на свой вопрос за бонус.
КАРТА

@MAP я попробую еще раз. Я пытался использовать лучший отладчик (KDbg), но мне не удалось использовать его в Ubuntu .
Пичи Уана

Ответы:


38

help running предоставляет некоторые советы:

Есть stepи nextинструкции (а также nextiи stepi).

(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.

Таким образом , мы можем видеть , что stepшаги Into подпрограмм, но nextшагнет через подпрограмму.

stepИ stepi(и , nextи nexti) являются отличительными от «линии» или «инструкции» шагом.

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

Связано это finish:

(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

Гораздо больше полезной информации можно найти по адресу https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html.


Что это значит, пока не достигнет другой строки источника ?
Пичи Уана

1
for(i=0;i<10;i++) { printf("%d\n",i); }одна строка источника, но несколько инструкций.
Стивен Харрис

3
Есть ли способ выйти? Я не мог найти это в помощи бегу.
nukeguy

1
Что вы имеете в виду под "выходом"? Команда finishзавершит текущий кадр стека, который обычно завершит текущую подпрограмму и вернется к вызывающей стороне.
Стивен Харрис

@PichiWuana gdb будет выполнять столько инструкций по сборке, сколько необходимо, пока не будет достигнута первая инструкция, представляющая следующую строку исходного кода
U007D

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.