Wpisałem help
, gdy byłem w GDB, ale nie znalazłem nic o wkroczeniu, kroku -over and step-out. Umieściłem punkt przerwania w programie Asemblera w _start
(break _start
). Następnie wpisałem next
i zakończyło debugowanie. Wydaje mi się, że to dlatego, że zakończyło _start
i nie „t wkrocz w tak, jak chciałem.
Czy ktoś może pomóc?
Komentarze
- Przeczytaj pełną dokumentację GDB. O ile pamiętam, byli w tym bardzo pomocni, kiedy się tego nauczyłem. Niestety, od kilku dekad nie ' nie musiałem debugować żadnego programu na tym poziomie, więc wydaje się, że rzeczywiste polecenia zostały zamienione w moim mózgu. Tak więc naprawdę nie mogę ' napisać odpowiedzi. Ale jeśli zrozumiesz to na podstawie podręczników, możesz odpowiedzieć na własne pytanie, aby otrzymać premię.
- @MAP I ' spróbuję ponownie. Próbowałem użyć lepszego debuggera (KDbg), ale Nie ' nie udało mi się go używać w Ubuntu .
- gdb to dobry debugger. Możesz chcieć użyć Emacsa jako jego nakładki.
- gdb to okropny debugger. Istnieje mnóstwo rozszerzeń, aby poradzić sobie z tym, jak bardzo jest do bani. Okropna składnia, niespójne polecenia, niezgrabne okropne stronicowanie, archaiczne formatowanie, nie ' nie ma zrzutu heksowego. Więc nie, to ' nie jest dobrym debugerem. Jeśli myślisz, że tak, to nie ' nie użyłeś dobrego debuggera.
Odpowiedź
help running
zawiera kilka wskazówek:
Istnieją step
i next
instuctions (a także nexti
i 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.
Widzimy więc, że step
przechodzi do podprogramów, ale next
ponad podprogramami.
step
i stepi
(oraz next
i nexti
) są rozróżniane na podstawie przyrostów „line” lub „instrukcji”.
step -- Step program until it reaches a different source line stepi -- Step one instruction exactly
Powiązane: 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 więcej przydatnych informacji można znaleźć pod adresem https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Komentarze
- Co to oznacza oznacza dopóki nie osiągnie innej linii źródłowej ?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
to jedna linia źródłowa, ale wiele instrukcji. - Czy jest sposób, aby wyjść? Nie mogłem ' znaleźć w pomocy dotyczącej uruchamiania.
- Co masz na myśli, mówiąc o " wyjściu "? Polecenie
finish
zakończy bieżącą ramkę stosu, co normalnie zakończy bieżący podprogram i powróci do obiektu wywołującego. -
finish
lubfin
w GDB, tostep-out
wIDEA
lubEclipse
.
Odpowiedź
Przyszedłem tutaj, ponieważ miałem to samo pytanie . W końcu doszedłem do wniosku, że za każdym razem, gdy 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 continue
zakończyć pętli, a następnie wbiegnij do punktu przerwania. Przepraszamy, jeśli jest to oczywiste dla większości ludzi, ale prawdopodobnie jest to pomocne dla kogoś szukającego odpowiedzi na to pytanie.
Odpowiedź
Użyj polecenia „zakończ”; czasami robi to to samo, co „wyjście”. Kończy to, co robi stos (zwykle jest to funkcja) i przechodzi do następnego wiersza po tym. Wyszukaj polecenie, aby uzyskać więcej informacji.