Làm thế nào để tải chương trình đọc stdin và lấy tham số trong gdb?


101

Tôi có một chương trình lấy đầu vào từ stdin và cũng lấy một số tham số từ dòng lệnh. Nó trông như thế này:

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

Tôi cố gắng gỡ lỗi mã bằng gdb bên trong emacs, bằng Mx gdb, tôi cố gắng tải chương trình bằng lệnh:

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

Tuy nhiên, gdb không thích nó.

Câu hỏi được đặt ra từ đây . Rất tiếc, tôi không hiểu giải pháp và không chắc phải làm gì ngoài việc biên dịch với -gtùy chọn và chạy lệnh Mx gdb.

Câu trả lời:


132

Nếu bạn đang làm điều đó từ một trình bao, bạn sẽ làm như thế này:

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

Điều này dường như cũng hoạt động trong emacs.


Việc chuyển hướng dường như hoạt động nhưng tôi gặp một số lỗi. Không đọc được hình ảnh tệp đối tượng hợp lệ từ bộ nhớ. Chương trình đã thoát với mã 042. Có ý kiến ​​gì không?
vinc456

Đó có thể là một lỗi GDB chung và có thể không liên quan gì đến thực tế là bạn đang chạy trong emacs. Trước tiên, hãy tìm hiểu cách chạy GDB từ shell (với một câu hỏi mới nếu cần), sau đó lo lắng về việc chạy nó bên trong emacs.
Alnitak

1
Tôi đã hiểu rồi. Vì lý do nào đó, tôi đã nhập void main (int argc, char * argv []) thay vì "int main ..." và nó đã trượt mắt tôi. Dù sao mọi thứ đều hoạt động tốt bây giờ; Cảm ơn bạn đã giúp đỡ!
vinc456

2
Một lời cảm ơn muộn màng - cẩm nang gdb là một nỗi đau trong mông để nạo vét cho qua.
Đã xóa

1
Trên Windows sử dụng msys64 tôi nhận được <input.txtargvđối số cho chương trình của tôi :( Tôi sẽ giữ đào xung quanh những câu trả lời với gdb của tôi 8.2.1: stackoverflow.com/questions/3544325/...
ixe013

32

Có một số cách để làm điều đó:

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

hoặc là

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

hoặc là

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

trong đó runlệnh gdb ( r) sử dụng theo mặc định các đối số như đã đặt trước đó với set args.


4
Khi tôi thử điều này với gdb trong cygwin, nó không hoạt động. Lệnh "show args" cho thấy rằng tôi đã nhập args mà tôi muốn, nhưng khi tôi bắt đầu chương trình với "r", chương trình sẽ đợi cho đến khi tôi nhập nội dung thay vì đọc từ tệp được chỉ định.
người đàn ông không gian cardiff

1
@cardiffspaceman, tốt, tôi có thể không thử nghiệm nó với Cygwin - có lẽ phiên bản gdb của họ bằng cách nào đó giới hạn
maxschlepzig

Tại sao không chỉ đơn giản là gdb -ex 'r -path /home/user/work < input.txt' myprogramtrong biến thể thứ ba?
Ruslan

@Ruslan, công trình cũng - sử dụng 'bộ args ...' chỉ mang đến cho bạn cơ hội để tương tác xác định một số điểm break vv trước khi chạy chương trình
maxschlepzig

Đúng, nhưng bạn cũng có thể đặt điểm ngắt không tương tác, ví dụ gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan

6

Vì lợi ích của sự hoàn chỉnh khi bắt đầu một phiên gỡ lỗi, cũng có tùy chọn --args. I E)

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

14
Làm thế nào bạn sẽ chuyển hướng input.txt làm đầu vào cho chương trình của bạn khi bắt đầu một phiên gỡ lỗi như thế này?
Peter Ajtai

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

1
Điều đó chỉ hoạt động nếu "yourprog" mong đợi một tên tệp để chỉ định đầu vào, không phải chuyển hướng đầu vào.
Alnitak

0

Và nếu bạn không cần phải gỡ lỗi ngay từ đầu, bạn cũng có thể đính kèm vào một quy trình đã chạy bằng cách sử dụng:

$ gdb myprogram xxx

trong đó xxx là id quy trình. Sau đó, bạn không cần phải cho gdb biết các đối số bắt đầu.


4
Bạn đã bỏ lỡ câu trả lời cho tiêu đề câu hỏi, ở phần "đọc stdin". Tôi sẽ nhận xét tốt ở đâu đó nếu nó ngắn hơn.
Notinlist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.