Jag skrev help
medan jag var i GDB men hittade ingenting om steg in, steg -over och step-out. Jag satte en brytpunkt i ett monteringsprogram i _start
(break _start
). Efteråt skrev jag next
och det avslutade felsökningen. Jag antar att det berodde på att det slutade _start
och inte ”t steg in som jag ville.
Någon som kan hjälpa till?
Kommentarer
- Läs hela GDB-dokumentet. Som jag minns var de ganska hjälpsamma med detta när jag först lärde mig det. Tyvärr har jag inte ' t behövt felsöka något program på den nivån i flera decennier, så de verkliga kommandona verkar ha blivit utbytta i min hjärna. Så jag kan ' inte skriva ett svar. Men om du tar reda på det från manualerna kan du svara på din egen fråga för en bonus.
- @MAP I ' Försök igen. Jag försökte använda en bättre felsökare (KDbg) men Jag lyckas inte ' att använda den i Ubuntu .
- gdb är en bra felsökare. Du kanske vill använda Emacs som frontend.
- gdb är en hemsk debugger. Det finns en myriad av tillägg för att hantera hur mycket det suger. Fruktansvärd syntax, kommandon utan konsistens, klumpig hemsk personsökning, arkaisk formatering, ' t har en hexdump. Så nej, det är ' inte en bra felsökare. Om du tror att det är så har du inte ' inte använt en bra felsökare.
Svar
help running
ger några tips:
Det finns step
och next
instruktioner (och även nexti
och 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.
Så vi kan se att step
steg i underrutiner, men next
över underrutiner.
step
och stepi
(och next
och nexti
) skiljer sig från steg ”line” eller ”instruction”.
step -- Step program until it reaches a different source line stepi -- Step one instruction exactly
Relaterat är 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.
Mycket mer användbar information finns på https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Kommentarer
- Vad gör det menar med tills den når en annan källrad ?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
är en källrad men flera instruktioner. - Finns det ett sätt att gå ut? Jag kunde inte ' inte hitta det som hjälp att köra.
- Vad menar du med " steg ut "?
finish
-kommandot kommer att slutföra den aktuella stackramen, som normalt kommer att slutföra den aktuella underrutinen och återgå till den som ringer. -
finish
ellerfin
i GDB ärstep-out
iIDEA
ellerEclipse
.
Svar
Jag kom hit för att jag hade samma fråga . Jag tänkte så småningom att för mitt ändamål när som helst jag kunde använda något som ”step-out” av en loop kan jag bara ställa in en annan brytpunkt efter loop och sedan låta programmet continue
avslutas slingan och kör in i brytpunkten efteråt. Ledsen om det är uppenbart för de flesta men det är förmodligen till hjälp för någon som letar efter svar på den här frågan.
Svar
Använd kommandot ”finish”; detta gör ibland samma sak som ”steg ut”. Det avslutar vad stacken gör (en funktion vanligtvis) och går till nästa rad efter det. Leta upp kommandot för mer information.