$ gdb ./example.o core
Reading symbols from ./example.o...done.
[New LWP 17137]
Core was generated by `./example.o'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000055bc13b7b9a0 in getInputAndRun () at example.c:28
28 *result[1] = toupper(result[1][0]);
(gdb)
(gdb) bt
#0 0x000055bc13b7b9a0 in getInputAndRun () at example.c:28
#1 0x000055bc13b7ba1f in main () at example.c:37
(gdb) f 1
#1 0x000055bc13b7ba1f in main () at example.c:37
37 if (getInputAndRun() == -1) break;
(gdb) f 0
#0 0x000055bc13b7b9a0 in getInputAndRun () at example.c:28
28 *result[1] = toupper(result[1][0]);
ดูง่ายนะครับ แปลว่า stack ของ program เราปัจจุบันรัน 2 function อยู่คือ main() และ getInputRun() เราสามารถกระโดดไปมาด้วยด้วยคำสั่ง frame <stack_no> หรือ f <stack_no>
ต่อมาดู source code ด้วย list
หรือสั่ง list แบบมี parameter เพื่ออ่านบรรทัดที่ระบุ หรือ function ที่ระบุก็ได้ครับ
นอกจาก list ที่เป็น source code ภาษา c แล้ว เรายังสามารถอ่านเป็นภาษา assembly ได้ด้วย อันนี้แล้วแต่ที่ถนัดเลยครับ ถ้า compile พร้อม debug flag (-g) แทบไม่ต้องลง assembly เลย แต่หลายครั้งการลงไปดู assembly ก็ทำให้เราเห็นรายละเอียดอะไรเยอะกว่าเช่นกัน
เนื่องจาก stack ของ main ไม่มีอะไรให้เราดู เราจะดู stack getInputAndRun() กันนะครับ เริ่มจากอ่านตัวแปรต่างๆ ด้วย p <variable_name> หรือ x/<type> <variable_or_address> อาจจะงงๆ มาดูตัวอย่างเลยดีกว่า