GCC -g vs -g3 ค่าสถานะ GDB: ความแตกต่างคืออะไร?


108

เมื่อคอมไพล์ซอร์สโค้ด C ด้วย gcc หรือ Clang ฉันจะใช้-gแฟล็กเพื่อสร้างข้อมูลการดีบักสำหรับ gdb เสมอ

gcc -g -o helloworld helloworld.c

ฉันสังเกตเห็นว่ามีบางคนแนะนำ-g3แทน ความแตกต่างระหว่างแฟล็ก-gและ-g3แฟล็กคืออะไร? นอกจากนี้ยังมีความแตกต่างระหว่าง-gและ-ggdb?


15
ฉันมาที่นี่เพราะฉันใช้ makefile ของคนอื่นและเอกสารนั้นก็คือสัตว์ร้ายที่จะเริ่มต้นจาก คำถามดีๆที่มีใน StackOverflow เพื่อค้นหาคำตอบง่ายๆจาก Google
GreenAsJade

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

คำตอบ:


108

จากเอกสาร :

- ก

สร้างข้อมูลการดีบักในรูปแบบดั้งเดิมของระบบปฏิบัติการ (สแต็ค, COFF, XCOFF หรือ DWARF 2) GDB สามารถทำงานกับข้อมูลการดีบักนี้ได้ ในระบบส่วนใหญ่ที่ใช้รูปแบบการแทง -g จะเปิดใช้งานข้อมูลการดีบักพิเศษที่ GDB เท่านั้นที่สามารถใช้ได้ ข้อมูลเพิ่มเติมนี้ทำให้การดีบักทำงานได้ดีขึ้นใน GDB แต่อาจทำให้ดีบักเกอร์อื่น ๆ ขัดข้องหรือปฏิเสธที่จะอ่านโปรแกรม หากคุณต้องการควบคุมว่าจะสร้างข้อมูลเพิ่มเติมหรือไม่ให้ใช้ -gstabs +, -gstabs, -gxcoff +, -gxcoff หรือ -gvms (ดูด้านล่าง)

...


-ggdb

จัดทำข้อมูลการดีบักเพื่อใช้โดย GDB ซึ่งหมายถึงการใช้รูปแบบที่แสดงออกมากที่สุดที่มีอยู่ (DWARF 2, สแต็คหรือรูปแบบเนทีฟหากไม่ได้รับการสนับสนุน) รวมถึงส่วนขยาย GDB หากเป็นไปได้


-gvmslevel

ขอข้อมูลการดีบักและใช้ระดับเพื่อระบุจำนวนข้อมูล ระดับเริ่มต้นคือ 2 ระดับ 0 ไม่มีข้อมูลการดีบักเลย ดังนั้น -g0 จึงลบ -g

....

ระดับ 3 ประกอบด้วยข้อมูลเพิ่มเติมเช่นข้อกำหนดมาโครทั้งหมดที่มีอยู่ในโปรแกรม ดีบักเกอร์บางตัวรองรับการขยายมาโครเมื่อคุณใช้ -g3


10
อธิบายได้ว่าอะไรคือความแตกต่างระหว่างตัวอย่างเช่น "รูปแบบที่แสดงออกมากที่สุด" และ "ข้อมูลเพิ่มเติม" พารามิเตอร์เหล่านี้ฟรีหรือไม่? หลายคนพูดถึง GDB ... ขอบคุณ!
rogerdpack

28

tl; dr:เพื่อตอบคำถามเฉพาะของคุณ-g3"รวมข้อมูลเพิ่มเติมเช่นคำจำกัดความของมาโคร ... ตัวแก้ไขข้อบกพร่องบางตัวสนับสนุนการขยายมาโครเมื่อคุณใช้-g3" ในขณะที่-gไม่รวมข้อมูลเพิ่มเติมนี้

คำตอบที่กว้างขึ้นคือ gcc รองรับข้อมูลการดีบักสี่ระดับตั้งแต่-g0(ข้อมูลการดีบักถูกปิดใช้งาน) ถึง-g3(ข้อมูลการดีบักสูงสุด)

ระบุเทียบเท่ากับ-g -g2น่าแปลกใจที่เอกสาร gccพูดเพียงเล็กน้อยเกี่ยวกับข้อมูล-g/ -g2รวมหรือไม่รวม:

ขอข้อมูลการดีบักและใช้ระดับเพื่อระบุจำนวนข้อมูล ระดับเริ่มต้นคือ 2 ระดับ 0 ไม่มีข้อมูลการดีบักเลย ดังนั้น -g0 จึงลบ -g

ระดับ 1 ให้ข้อมูลน้อยที่สุดเพียงพอสำหรับการสร้าง backtraces ในส่วนของโปรแกรมที่คุณไม่ได้วางแผนที่จะแก้ไขข้อบกพร่อง ซึ่งรวมถึงคำอธิบายของฟังก์ชันและตัวแปรภายนอกและตารางหมายเลขบรรทัด แต่ไม่มีข้อมูลเกี่ยวกับตัวแปรโลคัล

ระดับ 3 ประกอบด้วยข้อมูลเพิ่มเติมเช่นข้อกำหนดมาโครทั้งหมดที่มีอยู่ในโปรแกรม ดีบักเกอร์บางตัวรองรับการขยายมาโครเมื่อคุณใช้ -g3

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