Bagaimana cara melangkah masuk, melangkah keluar dan melangkah keluar dengan GDB?

42

Saya mengetik helpsaat berada di GDB tetapi tidak menemukan apa pun tentang step-in, step-over, dan step-out. Saya meletakkan breakpoint dalam program Majelis di _start( break _start). Setelah itu saya mengetik nextdan selesai debugging. Saya kira itu karena sudah selesai _startdan tidak masuk seperti yang saya inginkan.

Adakah yang bisa membantu?

Pichi Wuana
sumber
Baca dokumen GDB lengkap. Seingat saya, mereka sangat membantu tentang ini, ketika saya pertama kali mempelajarinya. Sayangnya, saya tidak perlu men-debug program apa pun pada tingkat itu selama beberapa dekade, sehingga perintah yang sebenarnya tampaknya sudah terhapus di otak saya. Jadi, saya tidak bisa menulis jawaban. Tetapi, jika Anda mencari tahu dari manual, maka Anda dapat menjawab pertanyaan Anda sendiri untuk bonus.
PETA
@MAP saya akan coba lagi. Saya mencoba menggunakan debugger yang lebih baik (KDbg) tetapi saya tidak berhasil menggunakannya di Ubuntu .
Pichi Wuana

Jawaban:

38

help running memberikan beberapa petunjuk:

Ada stepdan nextinstuctions (dan juga nextidan 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.

Jadi kita bisa melihat bahwa steplangkah-langkah dalam subrutin, tetapi nextakan melangkah lebih subrutin.

Tanda stepdan stepi(dan tanda nextdan nexti) membedakan dengan kenaikan "baris" atau "instruksi".

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

Terkait adalah 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.

Banyak informasi yang lebih berguna ada di https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html

Stephen Harris
sumber
Apa maksudnya sampai mencapai garis sumber yang berbeda ?
Pichi Wuana
1
for(i=0;i<10;i++) { printf("%d\n",i); }adalah satu baris sumber tetapi banyak instruksi.
Stephen Harris
3
Apakah ada cara untuk keluar? Saya tidak dapat menemukannya dalam menjalankan bantuan.
nukeguy
1
Apa yang Anda maksud dengan "step-out"? The finishperintah akan menyelesaikan stack frame saat ini, yang biasanya akan menyelesaikan subroutine saat ini dan kembali ke pemanggil.
Stephen Harris
@PichiWuana gdb akan melangkah melalui instruksi perakitan sebanyak yang diperlukan hingga instruksi pertama yang mewakili baris kode sumber berikutnya tercapai
U007D
0

Saya datang ke sini karena saya memiliki pertanyaan yang sama. Saya akhirnya menemukan bahwa untuk tujuan saya kapan saja saya bisa menggunakan sesuatu seperti "step-out" dari sebuah loop, saya bisa mengatur breakpoint lain setelah loop dan kemudian membiarkan program continueuntuk menyelesaikan loop dan menjalankan ke breakpoint sesudahnya. Maaf jika itu jelas bagi kebanyakan orang tetapi mungkin bermanfaat bagi seseorang yang mencari jawaban untuk pertanyaan ini.

fjahr
sumber