Dynamic Running GDB
ต่อมา GDB มันไม่ใช่แค่อ่าน coredump ที่ตายแล้วอย่างเดียว เราสามารถรันโปรแกรมของเราบน GDB ได้เลย ซึ่งลักษณะมันจะออกมาคล้ายๆโปรแกรม IDE ที่กดหยุดได้ สั่งเลื่อนที่ละบรรทัด ดูตัวแปร อะไรแบบนี้ได้หมดเลย ต่างกันแค่ว่ามันเปลี่ยนจาก GUI กดๆ มาเป็น commandline เท่านั้นเอง จริงๆแล้วมันทำอะไรได้เยอะกว่า GUI มาก ถ้าเราใช้ commandline เป็นครับ
การใช้ GDB เพื่อรันโปรแกรม ทำได้ 2 แบบครับ คือ
เริ่มต้น run ด้วย GDB เลย
gdb ./<executable>
เอา GDB ไปเสียบ program ที่รันอยู่แล้วก็ได้ครับ (อาจจะต้องใช้ sudo เพราะเรื่อง security ของ Linux version ใหม่ๆ)
sudo gdb ./<executable> -p <pid_of_running_prog>
ข้อสองเนี่ยมันดีตรงที่ เกิดโปรแกรมมีปัญหาต่างๆแต่ยังไม่ตาย (เช่น deadlock, data corrupt) GDB ก็สามารถเข้าไปดูได้เหมือนกัน
เพื่อความง่าย ผมจะทำวิธี 1 ให้เป็นตัวอย่างเพื่อทำตามนะครับ
สั่ง r
หรือ run
คือการรันโปรแกรมปกติครับ แต่มันไม่ค่อยมีประโยชน์เท่าไร หลายครั้งเราอยากหยุดโปรแกรมตรงสักจุดเพื่อดูว่าเกิดอะไรขึ้น เราจะใช้คำสั่ง break
หรือ b
ครับ
เรา break ได้หลายท่ามากเลยครับ ซึ่งหลังจากที่โปรแกรมทำงานไปถึงจุดที่เราสั่ง break ไว้ มันก็จะหยุดเพื่อรอให้เราสั่ง GDB อะไรก็ได้ต่อ ส่วนกรณีที่เราไม่เอา breakpoint ไหนแล้ว ก็สามารถเอาออกได้ด้วยคำสั่ง delete
ระหว่างติด breakpoint เราสามารถสั่งให้มันรันทีละคำสั่งได้ ด้วย step
next
stepi
nexti
ครับ
step - ทำงานทีละบรรทัดของ source code แต่ถ้าเจอ function แล้ว function นั้นมี source code มันจะเข้าไปใน function นั้นด้วย ย่อด้วย
s
next - เหมือน step แต่ไม่เข้า function ย่อด้วย
n
stepi - ทำงานทีละบรรทัดของ assembly code (machine code) เข้าไปใน function ที่เจอด้วย ย่อด้วย
si
nexti - เหมือน stepi แต่ไม่เข้า function ย่อด้วย
ni
นอกจากนี้มีคำสั่งอื่นๆอีกครับ
1. continue - ย่อด้วย c
คือให้มันทำงานต่อ จนจบ หรือจนเจอ breakpoint ใหม่
2. finish - ทำงานจนจบ function แล้วหยุด
3. until - ทำจนถึงบรรทัดที่ระบุ ให้อารมณ์คล้ายๆ temporary breakpoint
ส่วนเวลากด enter ใน GDB โดยไม่ได้ระบุคำสั่งอะไร จะแปลว่าให้รันคำสั่งก่อนหน้าอีกครั้งหนึง จึงไม่ต้องพิมพ์ next next next บ่อยๆนะครับ enter รัวๆได้เลย
รันจนมัน segmentation fault ได้เลยครับ ก็จะเห็นละว่าเราสามารถสั่งให้โปรแกรมเราทำงานทีละบรรทัดได้ดั่งใจเลย ไม่ต้องเอา printf ไปแทรกทุกบรรทัดละ ทีเหลือก็ความเชี่ยวชาญกับความชินมือละครับ ต้องค่อยๆฝึกละ
Last updated
Was this helpful?