ฉันมีไลบรารีที่คอมไพล์แล้วบน x86 Linux และฉันต้องการตรวจสอบอย่างรวดเร็วว่ามีการคอมไพล์ด้วยสัญลักษณ์การดีบักหรือไม่
ฉันมีไลบรารีที่คอมไพล์แล้วบน x86 Linux และฉันต้องการตรวจสอบอย่างรวดเร็วว่ามีการคอมไพล์ด้วยสัญลักษณ์การดีบักหรือไม่
คำตอบ:
หากคุณใช้งานบน Linux ให้ใช้objdump --debuggingไฟล์. ควรมีรายการสำหรับไฟล์อ็อบเจ็กต์แต่ละไฟล์ในไลบรารี สำหรับไฟล์ออบเจ็กต์ที่ไม่มีสัญลักษณ์การดีบักคุณจะเห็นสิ่งต่อไปนี้
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
หากมีสัญลักษณ์การดีบักเอาต์พุตจะมีรายละเอียดมากขึ้น
objdump -gไม่มีอะไรให้ฉันสำหรับการทดสอบง่ายๆรวบรวมทั้งแบบมีและไม่มีgทำให้ไม่มีประโยชน์อย่างมีประสิทธิภาพ Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22 nm -aดูเหมือนจะมีประโยชน์มากกว่า
คำสั่งที่แนะนำ
objdump --debugging libinspected.a
objdump --debugging libinspected.so
ทำให้ฉันได้ผลลัพธ์เดียวกันเสมออย่างน้อยบน Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
ไม่ว่าไลบรารีที่เก็บถาวร / แชร์จะสร้างขึ้นโดยมีหรือไม่มี-gตัวเลือกก็ตาม
จริงๆสิ่งที่ช่วยให้ฉันเพื่อตรวจสอบว่า-gถูกใช้เป็นreadelfเครื่องมือ:
readelf --debug-dump=decodedline libinspected.so
หรือ
readelf --debug-dump=line libinspected.so
สิ่งนี้จะพิมพ์ชุดบรรทัดที่ประกอบด้วยชื่อไฟล์ต้นทางหมายเลขบรรทัดและที่อยู่หากข้อมูลการแก้ไขข้อบกพร่องดังกล่าวรวมอยู่ในไลบรารีมิฉะนั้นจะไม่พิมพ์อะไรเลย
คุณอาจจะผ่านสิ่งที่คุ้มค่าที่คุณจะพบสิ่งที่จำเป็นสำหรับตัวเลือกแทน--debug-dumpdecodedline
สิ่งที่ช่วยได้คือ:
gdb mylib.so
มันพิมพ์เมื่อไม่พบสัญลักษณ์การดีบัก:
Reading symbols from mylib.so...(no debugging symbols found)...done.
หรือเมื่อพบ:
Reading symbols from mylib.so...done.
ไม่มีคำตอบก่อนหน้านี้ที่ให้ผลลัพธ์ที่มีความหมายสำหรับฉัน: libs ที่ไม่มีสัญลักษณ์ดีบักให้เอาต์พุตจำนวนมาก ฯลฯ
nm -a <lib> จะพิมพ์สัญลักษณ์ทั้งหมดจากไลบรารีรวมถึงสัญลักษณ์การดีบัก
ดังนั้นคุณสามารถเปรียบเทียบผลลัพธ์ของnm <lib>และnm -a <lib>- หากแตกต่างกัน lib ของคุณจะมีสัญลักษณ์ดีบักบางอย่าง
nm -aมีนามแฝงnm --debug-symsที่อธิบายตัวเอง :-)
diff <(nm <lib>) <(nm -a <lib>)เพื่อรับความแตกต่างอย่างง่าย
บน OSX คุณสามารถใช้dsymutil -sและdwarfdump.
การใช้dsymutil -s <lib_file> | moreคุณจะเห็นเส้นทางไฟล์ต้นทางในไฟล์ที่มีสัญลักษณ์การดีบัก แต่จะมีเพียงชื่อฟังก์ชันเท่านั้น
dsymutil -s? การมีอยู่ของเอาต์พุตหมายความว่าสร้างขึ้นด้วยสัญลักษณ์การดีบักหรือควรเป็น grepped?
คุณสามารถใช้objdumpสำหรับสิ่งนี้
แก้ไข: จากหน้าคน:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
คำตอบที่แนะนำการใช้objdump --debuggingหรือreadelf --debug-dump=...ไม่ทำงานในกรณีที่ข้อมูลการดีบักถูกเก็บไว้ในไฟล์ที่แยกจากไบนารีกล่าวคือไบนารีมีส่วนลิงก์ดีบัก readelfบางทีหนึ่งจะเรียกว่าข้อผิดพลาดใน
รหัสต่อไปนี้ควรจัดการสิ่งนี้อย่างถูกต้อง:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
ดูแยกไฟล์ดีบักในคู่มือ GDB สำหรับข้อมูลเพิ่มเติม
obdjump -W libและreadelf -w lib. อันหลังสามารถกำหนดค่าได้มากขึ้นโปรดดูที่ manpage ของ readelf (1)