Bagaimana cara menjalankan program dengan argumen commandline menggunakan GDB dalam skrip Bash?

428

Saat menjalankan program di GDB, biasanya, argumen untuk program diberikan pada runperintah. Apakah ada cara untuk menjalankan program menggunakan GDB dan juga memberikan argumen dalam skrip shell?

Saya melihat jawaban dalam pertanyaan terkait, menyebutkan bahwa kami dapat melampirkan GDB ke program setelah skrip mulai dijalankan. Tetapi kemudian saya harus 'menunggu' programnya.

Apakah ada cara lain untuk melakukan ini?

terkulai
sumber
2
mungkin duplikat dari Bagaimana cara menyampaikan argumen dan mengarahkan stdin dari file ke program yang berjalan di gdb?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

612

Anda dapat menjalankan gdb dengan parameter --args,

gdb --args executablename arg1 arg2 arg3

Jika Anda ingin menjalankannya secara otomatis, letakkan beberapa perintah dalam file (mis. 'Run') dan berikan sebagai argumen: -x / tmp / cmds. Secara opsional, Anda dapat menjalankan dengan mode -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Hugo Ideler
sumber
53
Argg, man gdbtidak mengandung --args, itu sebabnya saya tidak menemukannya. gdb --helptidak.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 GDB adalah GNU. Untuk melihat dokumentasi lengkap alat GNU, ingatlah untuk menggunakan info gdbwaktu berikutnya :-).
Apteryx
1
@Apteryx mungkin suatu hari nanti aku akan belajar info. Jika Google atau Stack Overflow berhenti bekerja XD
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Saya terhubung ke info setelah menemukan kunci 'i' ( index-search). Coba info gdb:, lalu 'i', lalu '--args'. Ini akan membawa Anda langsung ke sana.
Apteryx
139
gdb -ex=r --args myprogram arg1 arg2

-ex=radalah kependekan dari -ex=rundan memberitahu gdb untuk menjalankan program Anda segera, daripada menunggu Anda mengetik "run" di prompt. Kemudian --argsmengatakan bahwa semua yang mengikuti adalah perintah dan argumen, seperti yang biasanya Anda ketik di prompt perintah.

Hugo
sumber
Tidak tahu tentang yang -exe=rsangat berguna!
Astaga
46

Cara lain untuk melakukan ini, yang secara pribadi saya temukan sedikit lebih nyaman dan intuitif (tanpa harus mengingat --argsparameter), adalah mengkompilasi secara normal, dan menggunakan r arg1 arg2 arg3langsung dari dalam gdb, seperti:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
sumber
23
Inilah yang diharapkan OP agar tidak perlu dilakukan.
KarateSnowMachine
6
Hmmm, ya, terima kasih, poin yang adil. Saya tidak yakin bagaimana itu lolos dari pemberitahuan saya begitu lama. Saya pikir saya akan meninggalkan jawabannya di sini, namun, karena iirc, saya menemukan pertanyaan ini ketika saya mencari di Google sesuatu seperti "Bagaimana cara melewati argumen baris perintah menggunakan gdb", dan menemukan jawaban yang hilang, saya kemudian menambahkannya , tanpa menyadari (selama hampir setahun!) bahwa jawaban saya tidak menjawab pertanyaan yang ada.
aspiring_sarge
2
@ KarateSnowMachine Sebagai seseorang yang datang dari Google juga, jawaban ini lebih sesuai dengan apa yang saya cari. Mungkin kita harus merevisi pertanyaan menjadi lebih umum karena memiliki judul umum, atau mungkin kita harus mempersempit judul itu. Menjadikannya tidak terlalu membatasi mungkin akan lebih bermanfaat bagi lebih banyak pembaca.
jpmc26
18

Anda dapat membuat file dengan konteks:

run arg1 arg2 arg3 etc

program input

Dan panggilan gdb suka

gdb prog < file
George Kastrinis
sumber
4

gdb memiliki --init-command <somefile>tempat somefile memiliki daftar perintah gdb untuk dijalankan, saya menggunakan ini untuk memiliki //GDBkomentar dalam kode saya, lalu `

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

sebagai skrip, yang menempatkan perintah untuk memuat simbol debug, dan kemudian menghasilkan daftar perintah break untuk meletakkan break point untuk setiap //GDBkomentar, dan mulai menjalankannya

Austin_Anderson
sumber
4

Jika --argsparameter tidak berfungsi pada mesin Anda (yaitu pada Solaris 8), Anda dapat memulai gdb like

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

Dan Anda dapat menggabungkan ini dengan memasukkan file ke stdin dan "menjalankan dengan segera":

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

Selain jawaban Hugo Ideler. Saat menggunakan argumen yang memiliki awalan --atau suka sendiri -, saya tidak yakin akan konflik dengan gdb satu.

Tampaknya gdb mengambil semua argsopsi setelah sebagai argumen untuk program.

Pada awalnya saya ingin memastikan, saya berlari gdb dengan tanda kutip di sekitar argumen Anda, itu dihapus saat peluncuran.

Ini juga berfungsi, tetapi opsional:

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

Ini tidak berfungsi:

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

Dalam hal ini, -tuidigunakan sebagai parameter program saya bukan sebagai gdb.

Sandburg
sumber
1

Sangat terlambat, tapi di sini ada metode yang bekerja selama gdbsesi.

gdb <executable>

kemudian

(gdb) apropos argument

Ini akan mengembalikan banyak kecocokan, yang bermanfaat adalah set args.

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

set args arg1 arg2 ...

kemudian

r

Ini akan menjalankan program, meneruskan ke argumen utama (argc, argv) dan jumlah argumen.

alinsoar
sumber