Am tastat help
în timp ce eram în GDB, dar nu am găsit nimic despre pas, pas -over și step-out. Am pus un punct de întrerupere într-un program de asamblare în _start
(break _start
). Ulterior am tastat next
și a terminat depanarea. Cred că a fost pentru că a terminat _start
și nu „t step-into așa cum am dorit.
Oricine poate ajuta?
Comentarii
- Citiți documentele GDB complete. După cum îmi amintesc, au fost destul de utile în legătură cu acest lucru, când am învățat-o prima dată. Din păcate, nu am ' nevoie de depanarea oricărui program la acel nivel timp de câteva decenii, astfel încât comenzile efective par să fi fost schimbate în creierul meu. Deci, nu pot ' să scriu cu adevărat un răspuns. Dar, dacă vă dați seama din manuale, atunci puteți răspunde la propria întrebare pentru un bonus.
- @MAP I ' Voi încerca din nou. Am încercat să folosesc un depanator mai bun (KDbg), dar nu reușesc să-l folosesc în Ubuntu . ' / li>
- gdb este un bun depanator. Poate doriți să utilizați Emacs ca frontend.
- gdb este un depanator îngrozitor. Există o multitudine de extensii pentru a face față cât de mult e de rahat. Sintaxa îngrozitoare, comenzi neconforme, paginarea groaznică, formatarea arhaică, nu are o descărcare hexagonală. Deci nu, ' nu este un depanator bun. Dacă credeți că este, nu ați ' folosit un depanator bun.
Răspuns
help running
oferă câteva sugestii:
Există step
și next
instrucțiuni (și, de asemenea, 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.
Deci putem vedea că step
pași în subrutine, dar next
peste subrutine.
step
și stepi
(și și nexti
) se disting prin incremente de „linie” sau „instrucțiune”.
step -- Step program until it reaches a different source line stepi -- Step one instruction exactly
În legătură este 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.
Mai multe informații utile sunt la https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Comentarii
- Ce înseamnă înseamnă prin până când ajunge la o altă linie sursă ?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
este o linie sursă, dar instrucțiuni multiple. - Există o modalitate de a ieși? Nu am putut ' să-l găsesc în funcționarea ajutorului.
- Ce vrei să spui prin " step-out "? Comanda
finish
va completa cadrul curent al stivei, care va completa în mod normal subrutina curentă și va reveni la apelant. -
finish
saufin
în GDB, estestep-out
înIDEA
sauEclipse
.
Răspuns
Am venit aici pentru că aveam aceeași întrebare . În cele din urmă mi-am dat seama că, pentru scopul meu, de fiecare dată când aș putea folosi ceva de genul „step-out” dintr-o buclă, pot seta un alt punct de întrerupere după buclă și apoi să las programul continue
să termine bucla și treceți apoi la punctul de întrerupere. Ne pare rău dacă acest lucru este evident pentru majoritatea oamenilor, dar este probabil util pentru cineva care caută un răspuns la această întrebare.
Răspuns
Folosiți comanda „finisare”; uneori, acest lucru face același lucru ca și „ieșirea”. Se va termina ceea ce face stiva (o funcție, de obicei) și va merge la următoarea linie după aceea. Căutați comanda pentru mai multe informații.