ฉันจะเรียกใช้โปรแกรมด้วยอาร์กิวเมนต์ commandline โดยใช้ GDB ภายในสคริปต์ Bash ได้อย่างไร


428

เมื่อเรียกใช้โปรแกรมบน GDB โดยปกติแล้วอาร์กิวเมนต์สำหรับโปรแกรมจะถูกกำหนดที่runคำสั่ง มีวิธีเรียกใช้โปรแกรมโดยใช้ GDB และให้อาร์กิวเมนต์ภายในเชลล์สคริปต์หรือไม่

ฉันเห็นคำตอบในคำถามที่เกี่ยวข้องโดยกล่าวถึงว่าเราสามารถแนบ GDB กับโปรแกรมหลังจากที่สคริปต์เริ่มทำงาน แต่ฉันจะต้อง 'รอ' โปรแกรม

มีวิธีอื่นในการทำเช่นนี้หรือไม่?


คำตอบ:


612

คุณสามารถเรียกใช้ gdb ด้วยพารามิเตอร์ --args

gdb --args executablename arg1 arg2 arg3

หากคุณต้องการให้มันรันโดยอัตโนมัติให้วางคำสั่งบางคำในไฟล์ (เช่น 'run') และตั้งเป็นอาร์กิวเมนต์: -x / tmp / cmds คุณสามารถเลือกรันด้วยโหมด -batch

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
Argg man gdbไม่ได้มี--argsนั่นคือเหตุผลที่ฉันไม่พบมัน gdb --helpทำ.
Ciro Santilli 郝海东冠状病六四事件法轮功

1
@CiroSantilli DB 改造. 法轮功六四事件 GDB คือ GNU เพื่อดูเอกสารเต็มรูปแบบของเครื่องมือ GNU อย่าลืมใช้info gdbครั้งต่อไป :-)
Apteryx

1
@Apteryx infoบางทีวันหนึ่งผมจะได้เรียนรู้ หาก Google หรือ Stack Overflow หยุดทำงาน XD
Ciro Santilli 法轮功冠状病六四事件法轮功

1
@CiroSantilli 新疆改造中心法轮功六四事件ฉันได้รับข้อมูลแล้วหลังจากค้นพบกุญแจ 'i' ( index-search) ลอง: info gdbแล้วตามด้วย 'i' และ '- ค่า' มันจะทำให้คุณมีสิทธิ์
Apteryx

138
gdb -ex=r --args myprogram arg1 arg2

-ex=rสั้น-ex=runและบอกให้ gdb เรียกใช้โปรแกรมของคุณทันทีแทนที่จะรอให้คุณพิมพ์ "run" ที่พรอมต์ จากนั้น--argsบอกว่าทุกสิ่งที่ตามมาคือคำสั่งและอาร์กิวเมนต์เช่นเดียวกับที่คุณพิมพ์ตามปกติในพรอมต์บรรทัดคำสั่ง


ไม่ทราบว่า-exe=rมีประโยชน์มาก!
Jeef

46

อีกวิธีหนึ่งในการทำเช่นนี้ซึ่งโดยส่วนตัวแล้วฉันพบว่าสะดวกและใช้งานง่ายกว่าเล็กน้อย (โดยไม่ต้องจำ--argsพารามิเตอร์) คือการคอมไพล์ตามปกติและใช้r arg1 arg2 arg3โดยตรงจากภายในgdbเช่น:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3

23
ตรงนี้เป็นสิ่งที่ OP หวังว่าจะไม่ต้องทำ
KarateSnowMachine

6
อืมใช่ขอบคุณขอบธรรม ฉันไม่แน่ใจว่าวิธีการที่แจ้งให้ทราบล่วงหน้าของฉันหนี ฉันคิดว่าฉันจะทิ้งคำตอบไว้ที่นี่ แต่เนื่องจาก iirc ฉันสะดุดกับคำถามนี้เมื่อฉัน googled บางอย่างเช่น "วิธีการส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งโดยใช้ gdb" และการหาคำตอบที่ขาดหายไปฉันจึงเพิ่มมัน โดยไม่รู้ตัว (เป็นเวลาเกือบหนึ่งปี!) ว่าคำตอบของฉันไม่ได้ตอบคำถามในมือ
aspiring_sarge

2
@KarateSnowMachine เป็นคนที่มาจาก Google เช่นกันคำตอบนี้เป็นมากขึ้นตามสายของสิ่งที่ฉันกำลังมองหา บางทีเราควรแก้ไขคำถามให้กว้างกว่าเดิมเพราะมันมีหัวเรื่องทั่วไปหรือบางทีเราควรทำให้ชื่อแคบลง การทำให้ข้อ จำกัด น้อยลงอาจเป็นประโยชน์ต่อผู้อ่านจำนวนมากขึ้น
jpmc26


4

gdb มี--init-command <somefile>ที่ somefile มีรายการคำสั่ง gdb ให้เรียกใช้ฉันใช้สิ่งนี้เพื่อ//GDBแสดงความคิดเห็นในรหัสของฉันจากนั้น `

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

เป็นสคริปต์ซึ่งทำให้คำสั่งโหลดสัญลักษณ์ดีบักจากนั้นสร้างรายการคำสั่ง break เพื่อวางจุดพักสำหรับแต่ละ//GDBข้อคิดเห็นและเริ่มต้นทำงาน


4

หาก--argsพารามิเตอร์ไม่ทำงานบนเครื่องของคุณ (เช่นใน Solaris 8) คุณอาจเริ่ม gdb เช่น

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

และคุณสามารถรวมมันเข้ากับไฟล์เพื่อ stdin และ "กำลังทำงานทันที":

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"

2

นอกจากคำตอบของ Hugo Ideler แล้ว เมื่อใช้อาร์กิวเมนต์ที่มีคำนำหน้าเป็นของตัวเอง--หรือ-ฉันไม่แน่ใจว่าจะขัดแย้งกับ gdb

ดูเหมือนว่า gdb จะใช้เวลาหลังจากargsตัวเลือกทั้งหมดเป็นอาร์กิวเมนต์สำหรับโปรแกรม

ตอนแรกฉันต้องการแน่ใจว่าฉันวิ่ง gdb ด้วยเครื่องหมายคำพูดรอบ args ของคุณมันจะถูกลบเมื่อเปิดตัว

วิธีนี้ใช้ได้เช่นกัน แต่ไม่บังคับ:

gdb --args executablename "--arg1" "--arg2" "--arg3"

สิ่งนี้ใช้ไม่ได้:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

ในกรณี-tuiนั้นใช้เป็นพารามิเตอร์โปรแกรมของฉันไม่ใช่ gdb one


1

สายเกินไป แต่นี่เป็นวิธีการที่ใช้งานได้ในระหว่างgdbเซสชัน

gdb <executable>

แล้วก็

(gdb) apropos argument

สิ่งนี้จะส่งคืนแมตช์ที่มีประโยชน์set argsมากมาย

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

แล้วก็

r

สิ่งนี้จะเรียกใช้โปรแกรมส่งผ่านไปยังหลัก (argc, argv) อาร์กิวเมนต์และจำนวนอาร์กิวเมนต์

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