Když jsem byl v GDB, zadal jsem help
, ale nenašel jsem nic o krok za krokem -over and step-out. Vložil jsem zarážku do montážního programu v _start
(break _start
). Poté jsem napsal next
a ladění bylo dokončeno. Myslím, že to bylo proto, že bylo dokončeno _start
a nebylo to „t vstoupit jak jsem chtěl.
Každý, kdo může pomoci?
Komentáře
- Přečtěte si úplné dokumenty GDB. Jak si vzpomínám, byli mi v tom docela nápomocni, když jsem se to poprvé učil. Bohužel jsem několik desítek let ' nepotřeboval ladit žádný program na této úrovni, takže se zdálo, že se mi skutečné příkazy v mozku vyměnily. Takže nemohu ' opravdu napsat odpověď. Pokud to však zjistíte z příruček, můžete pro bonus odpovědět na svou vlastní otázku.
- @MAP I ' zkusím to znovu. Snažil jsem se použít lepší debugger (KDbg), ale se mi ' nepodaří jej použít v Ubuntu .
- gdb je dobrý ladicí program. Možná budete chtít použít Emacs jako frontend.
- gdb je hrozný debugger. Existuje nesčetné množství rozšíření, která se zabývají tím, jak moc to naštve. Hrozná syntaxe, nedůsledné příkazy, neohrabané strašné stránkování, archaické formátování, nemá ' hexdump. Takže ne, ' to není dobrý debugger. Pokud si myslíte, že to je, pak jste ' nepoužili dobrý debugger.
Odpovědět
help running
poskytuje několik rad:
Existují step
a next
pokyny (a také nexti
a 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.
Vidíme tedy, že step
kroky do podprogramů, ale next
bude krok nad podprogramy.
step
a stepi
(a a nexti
) se rozlišují po krocích „line“ nebo „instruction“.
step -- Step program until it reaches a different source line stepi -- Step one instruction exactly
Související je 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.
Mnohem užitečnější informace najdete na https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Komentáře
- Co to dělá znamená dokud nedosáhne jiného zdrojového řádku ?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
je jeden zdrojový řádek, ale několik pokynů. - Existuje způsob, jak vystoupit? Nelze ' v běhu nápovědy jej najít.
- Co myslíte pod " krokem "? Příkaz
finish
dokončí aktuální rámec zásobníku, který obvykle dokončí aktuální podprogram a vrátí se volajícímu. -
finish
nebofin
v GDB jestep-out
vIDEA
neboEclipse
.
Odpověď
Přišel jsem sem, protože jsem měl stejnou otázku . Nakonec jsem přišel na to, že pro svůj účel mohu kdykoli použít něco jako „step-out“ smyčky, mohu po smyčce nastavit další zarážku a poté nechat program continue
dokončit smyčku a poté narazit na zarážku. Omlouváme se, pokud je to většině lidí zřejmé, ale je to pravděpodobně užitečné pro někoho, kdo hledá odpověď na tuto otázku.
Odpověď
Použijte příkaz „finish“; to někdy dělá totéž jako „step-out“. Dokončí to, co zásobník dělá (obvykle funkce), a poté přejde na další řádek. Další informace najdete v příkazu.