Як вступити, перейти та вийти з GDB?


42

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

Хтось може допомогти?


Прочитайте всі документи GDB. Як я пам’ятаю, вони були дуже корисні з цього приводу, коли я вперше дізнався це. На жаль, мені не потрібно було налагоджувати будь-яку програму на цьому рівні протягом кількох десятиліть, тому фактичні команди, схоже, замінилися в моєму мозку. Отже, я не можу реально написати відповідь. Але якщо ви це зрозумієте з посібників, то можете отримати відповідь на власне запитання про бонус.
КАРТА

@MAP Спробую ще раз. Я спробував використати кращий налагоджувач (KDbg), але мені не вдалося використовувати його в Ubuntu .
Pichi Wuana

Відповіді:


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кроки в підпрограми, але 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


Що це означає, поки не досягне іншого джерела ?
Pichi Wuana

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.