list
คำสั่งพิมพ์ชุดของบรรทัด แต่ฉันต้องการบรรทัดเดียวฉันอยู่ที่ไหนและอาจเกิดข้อผิดพลาด
bt
หรือbacktrace
หรือwhere
พิมพ์สแต็คของการเรียกฟังก์ชันf
หรือframe
พิมพ์บรรทัดถัดไปที่จะดำเนินการ
list
คำสั่งพิมพ์ชุดของบรรทัด แต่ฉันต้องการบรรทัดเดียวฉันอยู่ที่ไหนและอาจเกิดข้อผิดพลาด
bt
หรือbacktrace
หรือwhere
พิมพ์สแต็คของการเรียกฟังก์ชันf
หรือframe
พิมพ์บรรทัดถัดไปที่จะดำเนินการ
คำตอบ:
ฉันได้รับข้อมูลเดียวกันในขณะที่แก้ไขข้อบกพร่อง แม้ว่าจะไม่ใช่ในขณะที่ฉันกำลังตรวจสอบ stacktrace ส่วนใหญ่คุณอาจเคยใช้ค่าสถานะการเพิ่มประสิทธิภาพที่ฉันคิด ตรวจสอบลิงก์นี้- สิ่งที่เกี่ยวข้อง
ลองรวบรวมโดย-g3
ลบแฟล็กการเพิ่มประสิทธิภาพออก จากนั้นก็อาจใช้งานได้ เฮ้!
-g
เพื่อให้มีข้อมูลการดีบัก แต่ตอนนี้ฉันก็อยู่ในสแต็กเฟรมซึ่งนำมาจากไลบรารีที่ใช้ร่วมกันแห่งหนึ่งซึ่งดูเหมือนจะไม่ได้รวบรวมข้อมูลบรรทัดไว้ ขอบคุณ kumar
คำสั่ง 'frame' จะให้สิ่งที่คุณกำลังมองหา (สามารถย่อได้แค่ 'f') นี่คือตัวอย่าง:
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
โดยไม่มีข้อโต้แย้ง 'เฟรม' จะบอกคุณว่าคุณอยู่ที่จุดใด (โดยอาร์กิวเมนต์จะเปลี่ยนเฟรม) ข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งกรอบที่สามารถพบได้ที่นี่
คำสั่งที่สามารถใช้หรือเฟรมได้ โดยที่คำสั่งจะให้ข้อมูลเพิ่มเติมพร้อมชื่อฟังก์ชัน
โปรดทราบว่า gdb เป็นคำสั่งที่มีประสิทธิภาพ - สามารถใช้คำสั่งระดับต่ำได้ - ดังนั้นจึงเชื่อมโยงกับแนวคิดการประกอบ
สิ่งที่คุณกำลังมองหาเรียกว่าตัวชี้คำสั่งเช่น:
ตัวชี้คำสั่งลงทะเบียนชี้ไปยังที่อยู่หน่วยความจำซึ่งโปรเซสเซอร์จะพยายามดำเนินการในครั้งต่อไป การเรียนการสอนชี้ที่เรียกว่าIPในโหมด 16 บิตEIPในโหมด 32 บิตและฉีกในโหมด 64 บิต
รายละเอียดเพิ่มเติมที่นี่
การลงทะเบียนทั้งหมดที่มีอยู่ในการดำเนินการ gdb สามารถแสดงได้ด้วย:
(gdb) info registers
ด้วยคุณจะพบว่าโหมดใดที่โปรแกรมของคุณกำลังทำงานอยู่ (ดูว่ามีการลงทะเบียนใดบ้าง)
จากนั้น (ที่นี่โดยใช้ register rip ที่พบบ่อยที่สุดในปัจจุบันให้แทนที่ด้วยeipหรือแทบจะไม่ipถ้าจำเป็น)
(gdb)info line *$rip
จะแสดงหมายเลขบรรทัดและแหล่งไฟล์
(gdb) list *$rip
จะแสดงให้คุณเห็นบรรทัดก่อนและหลัง
แต่น่าจะเป็น
(gdb) frame
น่าจะเพียงพอในหลาย ๆ กรณี
ip
ไม่เคยใช้ที่นี่ นอกจากนี้แทนอย่างชัดเจนสะกดชื่อของโปรแกรมเคาน์เตอร์คุณสามารถใช้นามแฝง GDB $pc
สำหรับมัน ดังนั้นx/10i $pc
จะแยกคำสั่ง 10 คำสั่งที่ตัวชี้คำสั่งปัจจุบันโดยไม่คำนึงถึงสถาปัตยกรรม - จะทำงานบน i386, x86_64, ARM เป็นต้น
คำตอบทั้งหมดข้างต้นถูกต้องสิ่งที่ฉันต้องการคือการใช้โหมด tui (ctrl + XA หรือ 'tui enable') ซึ่งจะแสดงตำแหน่งของคุณและฟังก์ชันในหน้าต่างแยกต่างหากซึ่งมีประโยชน์มากสำหรับผู้ใช้ หวังว่าจะช่วยเช่นกัน
backtrace
หรือwhere
แม้กระทั่งinfo line
หรือเพียงแค่bt
(สำหรับ backtrace) dirac.org/linux/gdbสำหรับการสอน gdb