วิธีตั้งค่าเบรกพอยต์บนไลบรารีที่แชร์ในอนาคตด้วยแฟล็กคำสั่ง


94

ฉันกำลังพยายามทำให้เซสชัน gdb อัตโนมัติโดยใช้--commandแฟล็ก ฉันกำลังพยายามตั้งค่าเบรกพอยต์สำหรับฟังก์ชันในไลบรารีที่ใช้ร่วมกัน (เทียบเท่ากับ Unix ของ DLL) cmds.gdb ของฉันมีลักษณะดังนี้:

set args /home/shlomi/conf/bugs/kde/font-break.txt
b IA__FcFontMatch
r

อย่างไรก็ตามฉันได้รับสิ่งต่อไปนี้:

shlomi: ~ / progs / bugs-external / kde / font-ทำลาย $ gdb --command = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (Mandriva Linux รีลีส 2009.0)
ลิขสิทธิ์ (C) 2008 Free Software Foundation, Inc.
ใบอนุญาต GPLv3 +: GNU GPL เวอร์ชัน 3 หรือใหม่กว่า 
นี่เป็นซอฟต์แวร์ฟรี: คุณสามารถเปลี่ยนและแจกจ่ายซ้ำได้ฟรี
ไม่มีการรับประกันตามขอบเขตที่กฎหมายอนุญาต พิมพ์ "แสดงการคัดลอก"
และ "แสดงการรับประกัน" สำหรับรายละเอียด
GDB นี้ถูกกำหนดค่าเป็น "i586-mandriva-linux-gnu" ...
(ไม่พบสัญลักษณ์การดีบัก)
ไม่ได้กำหนดฟังก์ชัน "IA__FcFontMatch"
ทำให้เบรกพอยต์รอการโหลดไลบรารีที่แชร์ในอนาคตไหม (y หรือ [n]) [ตอบ N; อินพุตไม่ได้มาจากเทอร์มินัล]

ดังนั้นจึงไม่ได้กำหนดจุดพัก ฉันจะกำหนดให้เป็นค่าเริ่มต้นเพื่อตอบ "y" เพื่อตั้งค่าเบรกพอยต์ที่รอการโหลดไลบรารีที่แชร์ในอนาคตได้อย่างไร

ฉันจำได้ว่าฉันสามารถทำบางอย่างได้ แต่จำไม่ได้ว่าอะไร


คำตอบ:


154

ตอบตัวเองว่าฉันอยากจะให้คำตอบที่มีคนให้ฉันกับ IRC:

(gdb) apropos รอดำเนินการ
การดำเนินการ - ระบุการดำเนินการที่จะดำเนินการที่จุดติดตาม
ตั้งเบรกพอยต์ - การตั้งค่าเฉพาะเบรกพอยต์
ตั้งค่าเบรกพอยต์ที่รอดำเนินการ - ตั้งค่าพฤติกรรมของดีบักเกอร์เกี่ยวกับเบรกพอยต์ที่รอดำเนินการ
แสดงเบรกพอยต์ - การตั้งค่าเฉพาะเบรกพอยต์
แสดงเบรกพอยต์ที่รอดำเนินการ - แสดงพฤติกรรมของดีบักเกอร์เกี่ยวกับเบรกพอยต์ที่รอดำเนินการ

ดังนั้นการตั้งค่าเบรกพอยต์ที่รอดำเนินการจึงเป็นเคล็ดลับ มันถูกใช้ในcmds.gdbเช่น

set breakpoint pending on
break <source file name>:<line number>

1
ที่บันทึกเบคอนของฉันพยายามดีบักภายใต้ Windows 7 โดยใช้ MinGW การตั้งค่าเริ่มต้นแตกต่างจากบน Linux - ขอบคุณมาก
bph

ด้วยเหตุผลบางประการฉันได้รับข้อผิดพลาดProgram received signal SIGILL, Illegal instructionนี้ ฉันกำลังจัดหาเบรกพอยต์จากไฟล์และฉันมีset breakpoint pending onจุดพักบางส่วนของฉันอยู่ในไลบรารีที่โปรแกรมโหลด หากฉันเพิ่มเบรกพอยต์ด้วยตนเองก็จะไม่มีข้อผิดพลาด มีใครประสบปัญหาคล้าย ๆ กันบ้าง?
หักเท้า

@brokenfoot: ฉันคิดว่าคุณควรถามคำถามของคุณด้วยคำถามระดับบนสุดใหม่แทนที่จะแสดงความคิดเห็นสำหรับคำตอบที่นี่ วิธีนี้จะมีคนสังเกตเห็นมากขึ้น นอกจากนี้คุณควรให้ข้อมูลเพิ่มเติมเกี่ยวกับระบบของคุณ
ปลาชโลมิ

12

OT: ในเทอร์มินัลจะมีลักษณะเช่นนี้เพื่อดีบัก Caja ในบรรทัดเดียว:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync

3
คุณพบสวิตช์ 'ex' ที่ไหนฉันไม่พบการอ้างอิงถึงพารามิเตอร์นี้ในเอกสารประกอบ (แต่ใช้งานได้ :))
Gearoid Murphy

-exไม่ได้ผลสำหรับฉัน ฉันต้องใส่คำสั่งในไฟล์ tmp และโทรด้วย:gdb -x /tmp/gdb.commands myexecutible
Jason Moore

5

ไม่มีสัญลักษณ์

objdump -t /lib/libacl.so
SYMBOL TABLE:
no symbols
objdump -T /lib/libacl.so
...
00002bd0 g    DF .text  000000d0  ACL_1.0     acl_delete_entry
...


(gdb) break 0x0002bd0 

(gdb) x/20i acl_delete_entry
0x2bd0 <acl_delete_entry>:      stwu    r1,-32(r1)
0x2bd4 <acl_delete_entry+4>:    mflr    r0
0x2bd8 <acl_delete_entry+8>:    stw     r29,20(r1)
0x2bdc <acl_delete_entry+12>:   stw     r30,24(r1)
0x2be0 <acl_delete_entry+16>:   mr      r29,r4
0x2be4 <acl_delete_entry+20>:   li      r4,28972
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.