Làm cách nào để chạy chương trình với các đối số dòng lệnh bằng GDB trong tập lệnh Bash?


428

Khi chạy một chương trình trên GDB, thông thường, các đối số cho chương trình được đưa ra tại runlệnh. Có cách nào để chạy chương trình bằng GDB và cũng như đưa ra các đối số trong tập lệnh shell không?

Tôi đã thấy một câu trả lời trong một câu hỏi liên quan, đề cập rằng chúng ta có thể đính kèm GDB vào chương trình sau khi tập lệnh bắt đầu thực thi. Nhưng sau đó tôi sẽ phải 'chờ' chương trình.

Có một cách khác để làm điều này?


Câu trả lời:


612

Bạn có thể chạy gdb với tham số --args,

gdb --args executablename arg1 arg2 arg3

Nếu bạn muốn nó chạy tự động, hãy đặt một số lệnh trong một tệp (ví dụ: 'run') và đưa ra làm đối số: -x / tmp / cmds. Tùy chọn bạn có thể chạy với chế độ -batch.

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

53
Argg, man gdbkhông chứa --args, đó là lý do tại sao tôi không tìm thấy nó. gdb --helplàm.
Ciro Santilli 郝海东 冠状 病 事件 法轮功

1
@CiroSantilli 心 心 B GDB là GNU. Để xem tài liệu đầy đủ về các công cụ GNU, hãy nhớ sử dụng info gdblần sau :-).
Apterx

1
@Apteryx có thể một ngày nào đó tôi sẽ học info. Nếu Google hoặc Stack Overflow ngừng hoạt động XD
Ciro Santilli 郝海东 冠状 病 六四

1
@CiroSantilli 心 心 Tôi đã bị cuốn vào thông tin sau khi phát hiện ra phím 'i' ( index-search). Hãy thử : info gdb, sau đó 'i', rồi '--args'. Nó sẽ mang lại cho bạn quyền với nó.
Apterx

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

-ex=rlà viết tắt của -ex=runvà yêu cầu gdb chạy chương trình của bạn ngay lập tức, thay vì chờ bạn gõ "chạy" tại dấu nhắc. Sau đó --argsnói rằng mọi thứ tiếp theo là lệnh và đối số, giống như bạn thường gõ chúng tại dấu nhắc dòng lệnh.


Không biết về những -exe=rđiều rất hữu ích!
Jeef

46

Một cách khác để làm điều này, mà cá nhân tôi thấy hơi thuận tiện và trực quan hơn (không cần phải nhớ --argstham số), là biên dịch bình thường và sử dụng r arg1 arg2 arg3trực tiếp từ bên trong gdb, như vậy:

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

23
Đây chính xác là những gì OP đang hy vọng tránh phải làm.
KarateSnowMachine

6
Hmmm, vâng, cảm ơn bạn, điểm công bằng. Tôi không chắc làm thế nào mà thoát khỏi thông báo của tôi quá lâu. Tôi nghĩ rằng tôi sẽ để lại câu trả lời ở đây, tuy nhiên, vì iirc, tôi đã vấp phải câu hỏi này khi tôi googled một cái gì đó như "Làm thế nào để vượt qua các đối số dòng lệnh bằng gdb", và tìm thấy câu trả lời bị thiếu, tôi tiếp tục thêm nó vào , mà không nhận ra (trong gần một năm!) rằng câu trả lời của tôi không giải quyết được câu hỏi trong tầm tay.
aspiring_sarge

2
@KarateSnowMachine Là một người đến từ Google, câu trả lời này phù hợp hơn với những gì tôi đang tìm kiếm. Có lẽ chúng ta nên sửa lại câu hỏi để tổng quát hơn vì nó có tiêu đề chung như vậy, hoặc có lẽ chúng ta nên thu hẹp tiêu đề. Làm cho nó ít hạn chế hơn có lẽ sẽ hữu ích hơn cho số lượng độc giả lớn hơn.
jpmc26

18

Bạn có thể tạo một tệp có ngữ cảnh:

run arg1 arg2 arg3 etc

program input

Và gọi gdb như

gdb prog < file

4

gdb có --init-command <somefile>nơi somefile có một danh sách các lệnh gdb để chạy, tôi sử dụng điều này để có //GDBý kiến ​​trong mã của mình, sau đó `

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

như một tập lệnh, đặt lệnh để tải các biểu tượng gỡ lỗi và sau đó tạo một danh sách các lệnh ngắt để đặt điểm dừng cho mỗi //GDBnhận xét và bắt đầu chạy


4

Nếu --argstham số không hoạt động trên máy của bạn (tức là trên Solaris 8), bạn có thể bắt đầu gdb như

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

Và bạn có thể kết hợp điều này với việc nhập một tệp vào stdin và "chạy ngayelly":

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

2

Ngoài câu trả lời của Hugo Ideler. Khi sử dụng các đối số có tiền tố chính họ như --hoặc- , tôi không chắc chắn sẽ xung đột với gdb.

Dường như gdb lấy tất cả sau argstùy chọn làm đối số cho chương trình.

Lúc đầu tôi muốn chắc chắn, tôi đã chạy gdb với các trích dẫn xung quanh đối số của bạn, nó bị xóa khi khởi chạy.

Điều này cũng hoạt động, nhưng tùy chọn:

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

Điều này không hoạt động:

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

Trong trường hợp đó, -tuiđược sử dụng làm tham số chương trình của tôi không phải là gdb.


1

Quá muộn, nhưng đây là một phương pháp hoạt động trong gdbphiên.

gdb <executable>

sau đó

(gdb) apropos argument

Điều này sẽ trả lại rất nhiều trận đấu, một trong những hữu ích là set args.

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

set args arg1 arg2 ...

sau đó

r

Điều này sẽ chạy chương trình, chuyển đến chính (argc, argv) các đối số và số lượng đối số.

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.