Jak wejść, wejść i wyjść z GDB?

42

Pisałem na klawiaturze, helpgdy byłem w GDB, ale nie znalazłem nic na temat wkroczenia, przejścia i wyjścia. Umieszczam punkt przerwania w programie asemblera w _start( break _start). Następnie napisałem nexti zakończyłem debugowanie. Myślę, że było tak, ponieważ zakończyło się _starti nie wkroczyło tak, jak chciałem.

Ktoś, kto może pomóc?

Pichi Wuana
źródło
Przeczytaj pełną dokumentację GDB. Jak pamiętam, byli bardzo pomocni w tym, kiedy uczyłem się tego po raz pierwszy. Niestety nie musiałem debugować żadnego programu na tym poziomie przez kilka dziesięcioleci, więc wydaje się, że rzeczywiste polecenia zostały zamienione w moim mózgu. Tak naprawdę nie mogę napisać odpowiedzi. Ale jeśli rozwiążesz to w instrukcjach, możesz odpowiedzieć na własne pytanie o bonus.
MAP
@MAP Spróbuję ponownie. Próbowałem użyć lepszego debuggera (KDbg), ale nie udało mi się użyć go w Ubuntu .
Pichi Wuana,

Odpowiedzi:

38

help running zawiera kilka wskazówek:

Istnieją stepi nextinstynkty (a także nextii 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.

Tak więc widzimy, że stepkroki język podprogramów, ale nextzwiększy się podprogramów.

I steporaz stepi(i nexti nexti) odróżniają się przyrostami „linii” lub „instrukcji”.

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

Powiązane jest 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.

O wiele bardziej przydatne informacje można znaleźć na stronie https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html

Stephen Harris
źródło
Co to znaczy, dopóki nie osiągnie innej linii źródłowej ?
Pichi Wuana,
1
for(i=0;i<10;i++) { printf("%d\n",i); }to jedna linia źródłowa, ale wiele instrukcji.
Stephen Harris,
3
Czy istnieje sposób na wyjście? Nie mogłem znaleźć pomocy w bieganiu.
nukeguy
1
Co rozumiesz przez „wyjście”? finishPolecenie zakończyć bieżącą ramkę stosu, który zwykle zakończyć bieżącą podprogram i powrót do wywołującego.
Stephen Harris
@PichiWuana gdb wykona tyle instrukcji montażu, ile to konieczne, dopóki nie zostanie osiągnięta pierwsza instrukcja reprezentująca kolejny wiersz kodu źródłowego
U007D
0

Przyjechałem tutaj, ponieważ miałem to samo pytanie. W końcu doszedłem do wniosku, że w dowolnym momencie mogę użyć czegoś takiego jak „wyjście z pętli”, mogę po prostu ustawić kolejny punkt przerwania po pętli, a następnie pozwolić programowi continuezakończyć pętlę i uruchomić się do punktu przerwania później. Przykro nam, jeśli jest to oczywiste dla większości osób, ale prawdopodobnie jest pomocne dla kogoś, kto szuka odpowiedzi na to pytanie.

fjahr
źródło