Ik heb help
getypt terwijl ik in de GDB was, maar ik heb niets gevonden over instappen, stap -over en step-out. Ik heb een breekpunt in een Assembly-programma geplaatst in _start
(break _start
). Daarna typte ik next
en het voltooide de foutopsporing. Ik denk dat het was omdat het _start
klaar was en niet “t stap in zoals ik wilde.
Iedereen die kan helpen?
Reacties
- Lees de volledige GDB-documenten. Zoals ik me herinner, waren ze hier erg behulpzaam toen ik het voor het eerst leerde. Helaas heb ik ' geen programma hoeven te debuggen op dat niveau gedurende tientallen jaren, dus het lijkt alsof de eigenlijke commandos in mijn hoofd zijn uitgewisseld. Dus ik kan ' niet echt een antwoord schrijven. Maar als je het toch uit de handleidingen haalt, dan kun je je eigen vraag beantwoorden voor een bonus.
- @MAP Ik ' zal het opnieuw proberen. Ik heb geprobeerd een betere debugger (KDbg) te gebruiken, maar Ik slaag er niet ' in om het in Ubuntu te gebruiken.
- gdb is een goede debugger. Misschien wil je Emacs als frontend gebruiken.
- gdb is een vreselijke debugger. Er zijn een groot aantal extensies om om te gaan met hoeveel het waard is. Vreselijke syntaxis, niet-consostente commandos, onhandige vreselijke paginering, archaïsche opmaak, heeft ' geen hexdump. Dus nee, het ' is geen goede debugger. Als je denkt dat dit het geval is, heb je ' t geen goede debugger gebruikt.
Antwoord
help running
geeft enkele hints:
Er zijn step
en next
instuctions (en ook nexti
en 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.
We kunnen dus zien dat step
naar subroutines stapt, maar next
zal stappen over subroutines.
De step
en stepi
(en de next
en nexti
) onderscheiden zich door “line” of “instruction” incrementen.
step -- Step program until it reaches a different source line stepi -- Step one instruction exactly
Gerelateerd is 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.
Er is veel meer nuttige informatie op https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Reacties
- Wat doet het bedoel met totdat het een andere bronregel bereikt?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
is één bronregel maar meerdere instructies. - Is er een manier om uit te stappen? Ik kon ' het niet vinden in Help bij het uitvoeren.
- Wat bedoel je met " step-out "? Het
finish
commando voltooit het huidige stack frame, dat normaal gesproken de huidige subroutine voltooit en terugkeert naar de beller. -
finish
offin
in GDB, is destep-out
inIDEA
ofEclipse
.
Antwoord
Ik kwam hier omdat ik dezelfde vraag had . Ik kwam uiteindelijk tot de conclusie dat ik voor mijn doel elke keer dat ik zoiets als “step-out” van een lus kon gebruiken, gewoon een ander breekpunt na de lus kon instellen en het programma continue
kon laten eindigen de lus en daarna het breekpunt tegenkomen. Sorry als dat voor de meeste mensen duidelijk is, maar het is waarschijnlijk nuttig voor iemand die op zoek is naar een antwoord op deze vraag.
Antwoord
Gebruik het commando “finish”; dit doet soms hetzelfde als “uitstappen”. Het zal afmaken wat de stapel doet (meestal een functie), en daarna naar de volgende regel gaan. Zoek het commando op voor meer informatie.