Terwijl het debuggen van een uitvoerbaar gebruik met GDB , zijn er twee opdrachten die we kunnen gebruiken om door de uitvoering te stappen:
stepi
ENnexti
Wat is / zijn het verschil / s tussen deze twee en waarom zou iemand er een kiezen in de andere?
Hulp gebruiken in GDB zegt:
Stepi: Stap één instructie precies.
NEXTI: Stap één instructie, maar ga door met subroutine-oproepen.
Aangezien we hier te maken hebben met instructies en machinecode (het kleinste deel van een programma in uitvoering) kan ik niet achterhalen wat de subroutine-oproepen zijn.
Antwoord 1, Autoriteit 100%
stepi
is gedetailleerd dan nexti
. Als u sum()
van main()
-functie belt, bereikt u dan stepi
Bereikt u in de functie SUM (), maar nexti
niet.
Hieronder staat de screenshot wanneer u stepi
noemt wanneer u op Call of Sum () Instructie (IE, => 0x08048403 <+40>: call 0x8048419 <sum>
). De stepi
Instuction Routes u in de sum()
.
Als u nexti
DOEN Wanneer u op Call of Sum () Instructie (IE, => 0x08048403 <+40>: call 0x8048419 <sum>
) Dan gebruikt het de geretourneerde waarde van sum-methode en gaat naar de volgende instructie van de hoofdmethode, screenshot zoals hieronder.
Conclusie: Gebruik stepi
als u alle machine-instructies wilt zien die in uw processor zijn gebeurd. Gebruik nexti
als u alleen de machine-instructies wilt zien die worden uitgevoerd op de main()
.
Antwoord 2, autoriteit 36%
Het verschil is hoe call
wordt behandeld:
stepi
duikt incall
nexti
voertcall
uit maar leidt u niet door de code
Daarom is hier de semantische regel om het beter te onthouden: je moet stapals je door moet lopen