gdb: จะพิมพ์บรรทัดปัจจุบันหรือค้นหาหมายเลขบรรทัดปัจจุบันได้อย่างไร


100

list คำสั่งพิมพ์ชุดของบรรทัด แต่ฉันต้องการบรรทัดเดียวฉันอยู่ที่ไหนและอาจเกิดข้อผิดพลาด


23
backtraceหรือwhereแม้กระทั่งinfo lineหรือเพียงแค่bt(สำหรับ backtrace) dirac.org/linux/gdbสำหรับการสอน gdb
dwalter

btหรือbacktraceหรือwhereพิมพ์สแต็คของการเรียกฟังก์ชันfหรือframeพิมพ์บรรทัดถัดไปที่จะดำเนินการ
Eric Wang

คำตอบ:


23

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

ลองรวบรวมโดย-g3ลบแฟล็กการเพิ่มประสิทธิภาพออก จากนั้นก็อาจใช้งานได้ เฮ้!


1
อ่าแม้ว่าโปรแกรมของฉันจะถูกคอมไพล์-gเพื่อให้มีข้อมูลการดีบัก แต่ตอนนี้ฉันก็อยู่ในสแต็กเฟรมซึ่งนำมาจากไลบรารีที่ใช้ร่วมกันแห่งหนึ่งซึ่งดูเหมือนจะไม่ได้รวบรวมข้อมูลบรรทัดไว้ ขอบคุณ kumar
Boris Burkov

107

คำสั่ง 'frame' จะให้สิ่งที่คุณกำลังมองหา (สามารถย่อได้แค่ 'f') นี่คือตัวอย่าง:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

โดยไม่มีข้อโต้แย้ง 'เฟรม' จะบอกคุณว่าคุณอยู่ที่จุดใด (โดยอาร์กิวเมนต์จะเปลี่ยนเฟรม) ข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งกรอบที่สามารถพบได้ที่นี่


22

คำสั่งที่สามารถใช้หรือเฟรมได้ โดยที่คำสั่งจะให้ข้อมูลเพิ่มเติมพร้อมชื่อฟังก์ชัน


21

โปรดทราบว่า gdb เป็นคำสั่งที่มีประสิทธิภาพ - สามารถใช้คำสั่งระดับต่ำได้ - ดังนั้นจึงเชื่อมโยงกับแนวคิดการประกอบ

สิ่งที่คุณกำลังมองหาเรียกว่าตัวชี้คำสั่งเช่น:

ตัวชี้คำสั่งลงทะเบียนชี้ไปยังที่อยู่หน่วยความจำซึ่งโปรเซสเซอร์จะพยายามดำเนินการในครั้งต่อไป การเรียนการสอนชี้ที่เรียกว่าIPในโหมด 16 บิตEIPในโหมด 32 บิตและฉีกในโหมด 64 บิต

รายละเอียดเพิ่มเติมที่นี่

การลงทะเบียนทั้งหมดที่มีอยู่ในการดำเนินการ gdb สามารถแสดงได้ด้วย:

(gdb) info registers

ด้วยคุณจะพบว่าโหมดใดที่โปรแกรมของคุณกำลังทำงานอยู่ (ดูว่ามีการลงทะเบียนใดบ้าง)

จากนั้น (ที่นี่โดยใช้ register rip ที่พบบ่อยที่สุดในปัจจุบันให้แทนที่ด้วยeipหรือแทบจะไม่ipถ้าจำเป็น)

(gdb)info line *$rip

จะแสดงหมายเลขบรรทัดและแหล่งไฟล์

(gdb) list *$rip

จะแสดงให้คุณเห็นบรรทัดก่อนและหลัง

แต่น่าจะเป็น

(gdb) frame

น่าจะเพียงพอในหลาย ๆ กรณี


2
GDB ไม่รองรับโหมด 16 บิตฉันเชื่อว่าจึงipไม่เคยใช้ที่นี่ นอกจากนี้แทนอย่างชัดเจนสะกดชื่อของโปรแกรมเคาน์เตอร์คุณสามารถใช้นามแฝง GDB $pcสำหรับมัน ดังนั้นx/10i $pcจะแยกคำสั่ง 10 คำสั่งที่ตัวชี้คำสั่งปัจจุบันโดยไม่คำนึงถึงสถาปัตยกรรม - จะทำงานบน i386, x86_64, ARM เป็นต้น
Ruslan

4

คำตอบทั้งหมดข้างต้นถูกต้องสิ่งที่ฉันต้องการคือการใช้โหมด tui (ctrl + XA หรือ 'tui enable') ซึ่งจะแสดงตำแหน่งของคุณและฟังก์ชันในหน้าต่างแยกต่างหากซึ่งมีประโยชน์มากสำหรับผู้ใช้ หวังว่าจะช่วยเช่นกัน

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