จะเรียกใช้ไฟล์ปฏิบัติการใน GDB โดยอัตโนมัติได้อย่างไร


92

ฉันต้องการgdbเรียกใช้ไฟล์ปฏิบัติการทันทีราวกับว่าฉันพิมพ์คำว่า "run" (แรงจูงใจ: ฉันไม่ชอบพิมพ์ "run")

วิธีหนึ่งคือไปป์คำสั่งเพื่อทำgdbสิ่งนี้:

$ echo run | gdb myApp

แต่ปัญหาของแนวทางนี้คือคุณสูญเสียการโต้ตอบกับgdbเช่น หากเบรกพอยต์ทริกเกอร์หรือmyAppขัดข้องให้gdbออก วิธีการนี้จะกล่าวถึงที่นี่

เมื่อดูตัวเลือกใน--helpฉันไม่เห็นวิธีที่จะทำ แต่บางทีฉันอาจพลาดบางอย่าง

คำตอบ:


129
gdb -ex run ./a.out

หากคุณต้องการส่งผ่านข้อโต้แย้งไปที่a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

แก้ไข: Orionบอกว่าสิ่งนี้ใช้ไม่ได้กับ Mac OSX

-exธงได้รับการบริการตั้งแต่GDB-6.4(ปล่อยตัวในปี 2005) แต่ OSX ใช้ส้อมแอปเปิ้ลของ GDB และ XCode ล่าสุดเสือดาวมีGDB 6.3.50-20050815 (Apple version gdb-967)ดังนั้นคุณจะออกจากโชค

การสร้างGDB-7.0.1รุ่นปัจจุบันเป็นทางออกหนึ่งที่เป็นไปได้ เพียงให้แน่ใจว่าการอ่านนี้


1
ขอบคุณสำหรับคำตอบ. บรรทัดนั้นทำงานเหมือนกับ "gdb ./a.out" สำหรับฉัน
orion elenzil

3
ฉันเพิ่งยืนยันว่าคุณสามารถส่งตัวเลือก -ex หลายตัวในบรรทัดคำสั่งและพวกเขาจะทำงานตามลำดับก่อนที่จะโอนอินพุต gdb ให้คุณ
Tung Nguyen

วิธีนี้ใช้ไม่ได้หากโปรแกรมมีอาร์กิวเมนต์เช่น./a.out a b
gigilibala

เนื่องจาก OSX / xcode ไม่รองรับ gdb นอกกรอบอีกต่อไป (lldb คือ gdb ใหม่) ตอนนี้ดูเหมือนจะเป็นแนวทางที่ดีกว่า
orion elenzil

ฉันสร้างไฟล์คำสั่งและใช้gdb -xกับระบบ Linux OS X ใช้LLVMและส่งเสียงดังดังนั้นตรวจสอบความสามารถในการดีบักของlldb.
Daisuke Aramaki

23

ฉันจะใช้ gdb-script:

gdb -x your-script

โดยที่สคริปต์ของคุณประกอบด้วยสิ่งต่างๆเช่น:

file a.out
b main
r

หลังจากนั้นคุณจะมีพรอมต์ gdb แบบโต้ตอบตามปกติ

แก้ไข :

นี่คือการเพิ่มประสิทธิภาพสำหรับคนขี้เกียจอย่างแท้จริง:

  1. บันทึกสคริปต์.gdbinitในรูปแบบworking directory.
  2. หลังจากนั้นคุณก็เรียกใช้ gdb เป็น

    gdb

... และ gdb จะโหลดและดำเนินการเนื้อหาของ. gdbinit โดยอัตโนมัติ


เฮ้ขอบคุณสำหรับคำตอบ ดูเหมือนว่าฉันต้องการอะไรยกเว้นฉันไม่ได้รับพรอมต์ gdb ฉันได้รับ gdb ถูกระงับและฉันกลับมาที่บรรทัดคำสั่งราวกับว่าฉันพิมพ์ "ctrl-z" ถ้าฉัน "fg" แล้ว gdb จะทำงานต่อและแอปจะทำงาน นี่คือ OS X
orion elenzil

orion: mmmh - มันน่าแปลกใจสำหรับฉัน ใช้งานได้ดีกับทุกรสชาติ UNIX ที่ฉันใช้จริง (Linux, Solaris, AIX) คุณใช้ gdb รุ่นอะไร

ฉันเพิ่งตรวจสอบพฤติกรรมของสิ่งนี้อีกครั้ง - ยังคงออกจากฉันไปที่บรรทัดคำสั่งที่มีการระงับ GNU gdb 6.3.50-20050815 (เวอร์ชัน Apple gdb-1518) (วันเสาร์ที่ 12 กุมภาพันธ์ 02:52:12 UTC 2011)
orion elenzil

@orionelenzil คิดว่าทำไม แต่ถ้าคุณใส่ไม่fgหลังจากที่rสายจะทำหน้าที่ sanely
DBR

startคำสั่งให้ทางลัดสำหรับb+ r: stackoverflow.com/a/2119606/895245
Ciro Santilli郝海东冠状病六四事件法轮功

20
(echo r ; cat) | gdb a.out

แมวช่วยให้คุณพิมพ์ต่อไปหลังจากที่ gdb หยุด


โอ้โฮน่ากลัว คุณต้อง ctrl-c หลังจากออกจาก gdb เพื่อหยุดแมว แต่ก็เยี่ยมมาก
orion elenzil

3
ดูเหมือนว่าคุณจะสูญเสียการควบคุมคีย์บางอย่างในอินสแตนซ์ gdb โดยใช้สิ่งนี้
Treviño

ยิ่งไปกว่านั้นคำถามเช่นMake breakpoint pending on future shared library load? (y or [n])จะถือว่าตอบว่า "ไม่" โดยอัตโนมัติ
Ruslan

6

start คำสั่ง

คำสั่งนี้เป็นอีกทางเลือกหนึ่งที่ดี:

gdb -ex start --args ./a.out arg1 arg2

มันเหมือนกับการวิ่ง แต่ยังกำหนดจุดพักชั่วคราวที่mainและหยุดที่นั่นด้วย

เบรกพอยต์ชั่วคราวนี้จะปิดใช้งานเมื่อถูกชน

starti

นอกจากนี้ยังมีสิ่งที่เกี่ยวข้องstartiซึ่งเริ่มต้นโปรแกรมและหยุดที่คำสั่งแรกแทนโปรดดูเพิ่มเติมที่: การหยุดที่คำสั่งรหัสเครื่องแรกใน GDB

ยอดเยี่ยมเมื่อคุณทำบางอย่างในระดับต่ำ


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