ฉันมีไลบรารีที่คอมไพล์แล้วบน 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-dump
decodedline
สิ่งที่ช่วยได้คือ:
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)