จะโหลดโปรแกรมอ่าน stdin และรับพารามิเตอร์ใน gdb ได้อย่างไร?


103

ฉันมีโปรแกรมที่รับอินพุตจาก stdin และใช้พารามิเตอร์บางอย่างจากบรรทัดคำสั่ง ดูเหมือนว่า:

cat input.txt > myprogram -path "/home/user/work"

ฉันพยายามดีบักโค้ดด้วย gdb ภายใน emacs โดย Mx gdb ฉันพยายามโหลดโปรแกรมด้วยคำสั่ง:

gdb cat input.txt > myprogram -path "/home/user/work"

อย่างไรก็ตาม gdb ไม่ชอบ

คำถาม cribbed จากที่นี่ น่าเสียดายที่ฉันไม่เข้าใจวิธีแก้ปัญหาและไม่แน่ใจว่าจะทำอย่างไรนอกเหนือจากการคอมไพล์ด้วย-gตัวเลือกและเรียกใช้คำสั่ง Mx gdb

คำตอบ:


133

หากคุณทำจากเปลือกคุณจะทำเช่นนี้:

% gdb myprogram
gdb> run params ... < input.txt

ดูเหมือนว่าจะใช้งานได้ภายใน emacs ด้วย


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

นั่นอาจเป็นข้อผิดพลาดทั่วไปของ GDB และอาจไม่เกี่ยวข้องกับความจริงที่ว่าคุณกำลังทำงานอยู่ใน emac เรียนรู้วิธีเรียกใช้ GDB จากเชลล์ก่อน (พร้อมคำถามใหม่หากจำเป็น) จากนั้นกังวลเกี่ยวกับการเรียกใช้งานภายใน emacs
Alnitak

1
ฉันคิดออกแล้ว ด้วยเหตุผลบางอย่างฉันพิมพ์คำว่า void main (int argc, char * argv []) แทน "int main ... " แล้วมันก็เล็ดลอดสายตาไป อย่างไรก็ตามทุกอย่างทำงานได้ดีในขณะนี้ ขอบคุณสำหรับความช่วยเหลือของคุณ!
vinc456

2
ขอบคุณที่ล่าช้า - คู่มือ gdb เป็นความเจ็บปวดที่ก้นในการขุดลอก
ลบ

1
ใน Windows โดยใช้ msys64 ฉันได้รับ<และinput.txtเป็นargvอาร์กิวเมนต์สำหรับโปรแกรมของฉัน :( ฉันจะค้นหาคำตอบเหล่านี้ต่อไปด้วย gdb 8.2.1: stackoverflow.com/questions/3544325/…
ixe013

32

มีหลายวิธีในการทำ:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

หรือ

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

หรือ

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

ที่ gdb runคำสั่ง ( r) set argsใช้โดยค่าเริ่มต้นการขัดแย้งเป็นชุดก่อนหน้านี้ด้วย


4
เมื่อฉันลองใช้ gdb ใน cygwin มันไม่ได้ผล คำสั่ง "show args" แสดงว่าฉันป้อน args ที่ต้องการ แต่เมื่อฉันเริ่มโปรแกรมด้วย "r" โปรแกรมจะรอจนกว่าฉันจะพิมพ์สิ่งต่างๆแทนที่จะอ่านจากไฟล์ที่ระบุ
มนุษย์อวกาศคาร์ดิฟฟ์

1
@cardiffspaceman ดีฉันไม่สามารถทดสอบกับ Cygwin ได้ - บางทีเวอร์ชัน gdb ของพวกเขาอาจมีจำนวน จำกัด
maxschlepzig

ทำไมไม่เพียงแค่gdb -ex 'r -path /home/user/work < input.txt' myprogramในตัวแปรที่สาม?
Ruslan

@Ruslan ทำงานได้ดี - การใช้ 'set args ... ' ช่วยให้คุณมีโอกาสในการกำหนดจุดพักและอื่น ๆ แบบโต้ตอบก่อนที่จะรันโปรแกรม
maxschlepzig

ทรู gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogramแต่คุณยังสามารถตั้งค่าเบรกพอยต์ที่ไม่ใช่การโต้ตอบเช่น
Ruslan

6

เพื่อความสมบูรณ์ในการเริ่มเซสชันการดีบักนอกจากนี้ยังมีตัวเลือก --args เช่น)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
คุณจะเปลี่ยนเส้นทาง input.txt เป็นอินพุตไปยัง yourprog เมื่อเริ่มเซสชันการดีบักเช่นนี้ได้อย่างไร
Peter Ajtai

1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar

2
ใช้งานได้ก็ต่อเมื่อ "yourprog" ต้องการชื่อไฟล์เพื่อระบุอินพุตไม่ใช่การเปลี่ยนทิศทางอินพุต
Alnitak

1

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

$ gdb myprogram xxx

โดยที่ xxx คือรหัสกระบวนการ จากนั้นคุณไม่จำเป็นต้องบอก gdb ถึงอาร์กิวเมนต์เริ่มต้น


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