ขั้นตอนในการก้าวเข้าสู่ขั้นตอนและก้าวออกไปด้วย GDB ได้อย่างไร?


42

ฉันพิมพ์helpในขณะที่ฉันอยู่ใน GDB แต่ไม่พบอะไรเลยเกี่ยวกับการก้าวเข้าสู่การก้าวออกไปและการก้าวออก ฉันใส่เบรกพอยต์ในโปรแกรม Assembly ใน_start( break _start) หลังจากนั้นฉันพิมพ์nextและเสร็จสิ้นการดีบัก ฉันเดาว่ามันเป็นเพราะมันเสร็จแล้ว_startและไม่ได้เข้าร่วมอย่างที่ฉันต้องการ

ใครก็ตามที่สามารถช่วยได้


อ่านเอกสาร GDB ฉบับเต็ม ตามที่ฉันจำได้พวกเขาค่อนข้างมีประโยชน์เกี่ยวกับเรื่องนี้เมื่อฉันเรียนรู้ครั้งแรก น่าเสียดายที่ฉันไม่จำเป็นต้องดีบักโปรแกรมใด ๆ ในระดับนั้นเป็นเวลาหลายสิบปีดังนั้นคำสั่งที่แท้จริงดูเหมือนจะเปลี่ยนไปในสมองของฉัน ดังนั้นฉันไม่สามารถเขียนคำตอบได้จริงๆ แต่ถ้าคุณเข้าใจจากคู่มือคุณสามารถตอบคำถามของคุณเองเพื่อรับโบนัส
แผนที่

@MAP ฉันจะลองอีกครั้ง ผมพยายามที่จะใช้การดีบักเกอร์ที่ดีกว่า (KDbg) แต่ผมไม่ประสบความสำเร็จที่จะใช้ในอูบุนตู
Pichi Wuana

คำตอบ:


38

help running ให้คำแนะนำบางอย่าง:

มีstepและnextชักชวน (และยังnextiและ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.

ดังนั้นเราจะเห็นstepขั้นตอนนั้นเป็นรูทีนย่อย แต่nextจะก้าวข้ามรูทีนย่อย

stepและstepi(และnextและnexti) จะแตกต่างจาก "สาย" หรือ "คำแนะนำ" เพิ่มขึ้น

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

ที่เกี่ยวข้องคือ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.

ข้อมูลที่เป็นประโยชน์มากขึ้นอยู่ที่https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html


มันหมายความว่าอะไรจนกว่าจะถึงบรรทัดที่แตกต่างกัน ?
Pichi Wuana

1
for(i=0;i<10;i++) { printf("%d\n",i); }เป็นหนึ่งบรรทัดซอร์ส แต่มีหลายคำสั่ง
Stephen Harris

3
มีวิธีที่จะก้าวออกมา? ฉันหามันไม่เจอในการช่วยเหลือ
nukeguy

1
"การก้าวออก" คุณหมายถึงอะไร finishคำสั่งจะเสร็จสมบูรณ์กรอบสแต็คในปัจจุบันซึ่งปกติจะดำเนินการย่อยในปัจจุบันและย้อนกลับไปยังผู้โทร
Stephen Harris

@PichiWuana gdb จะทำตามคำแนะนำในการประกอบจำนวนมากเท่าที่จำเป็นจนกว่าจะถึงคำสั่งแรกที่แสดงถึงซอร์สโค้ดบรรทัดถัดไป
U007D

0

ฉันมาที่นี่เพราะฉันมีคำถามเดียวกัน ในที่สุดฉันก็พบว่าเพื่อจุดประสงค์ของฉันเมื่อใดก็ตามที่ฉันสามารถใช้บางสิ่งบางอย่างเช่น "การก้าวออก" ของลูปฉันสามารถตั้งค่าเบรกพอยต์อีกอันหนึ่งหลังจากลูปแล้วปล่อยให้โปรแกรมcontinueเสร็จสิ้นลูป ขออภัยถ้าเห็นได้ชัดว่าคนส่วนใหญ่ แต่อาจเป็นประโยชน์สำหรับคนที่มองหาคำตอบสำหรับคำถามนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.