Bagaimana cara memuat program membaca stdin dan mengambil parameter di gdb?

101

Saya memiliki program yang mengambil masukan dari stdin dan juga mengambil beberapa parameter dari baris perintah. Ini terlihat seperti ini:

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

Saya mencoba men-debug kode dengan gdb di dalam emacs, dengan Mx gdb, saya mencoba memuat program dengan perintah:

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

Namun, gdb tidak menyukainya.

Pertanyaan diambil dari sini . Sayangnya saya tidak mengerti solusinya dan tidak yakin apa yang harus dilakukan selain mengkompilasi dengan -gopsi dan menjalankan perintah Mx gdb.

vinc456.dll
sumber

Jawaban:

132

Jika Anda melakukannya dari cangkang, Anda akan melakukannya seperti ini:

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

Tampaknya ini juga berfungsi dalam emacs.

Alnitak
sumber
Pengalihan tampaknya berfungsi tetapi saya mendapatkan beberapa kesalahan. Gagal membaca gambar file objek yang valid dari memori. Program keluar dengan kode 042. Ada ide?
vinc456
Itu mungkin kesalahan GDB umum, dan mungkin tidak ada hubungannya dengan fakta bahwa Anda menjalankan dalam emacs. Pelajari cara menjalankan GDB dari shell terlebih dahulu (dengan pertanyaan baru jika perlu), lalu khawatir tentang menjalankannya di dalam emacs.
Alnitak
1
Saya menemukan jawabannya. Untuk beberapa alasan saya mengetik void main (int argc, char * argv []) daripada "int main ..." dan itu menyelipkan mata saya. Bagaimanapun semuanya bekerja dengan baik sekarang; terima kasih atas bantuan Anda!
vinc456
2
Terima kasih yang terlambat - manual GDB sangat sulit untuk dilalui.
Dihapus
1
Di Windows menggunakan msys64 saya mendapatkan <dan input.txtsebagai argvargumen untuk program saya :( Saya akan terus menggali jawaban ini dengan gdb 8.2.1 saya: stackoverflow.com/questions/3544325/…
ixe013
32

Ada beberapa cara untuk melakukannya:

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

atau

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

atau

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

di mana runperintah gdb ( r) menggunakan secara default argumen seperti yang ditetapkan sebelumnya dengan set args.

maxschlepzig
sumber
4
Ketika saya mencoba ini dengan gdb di cygwin, itu tidak berhasil. Perintah "show args" menunjukkan bahwa saya memasukkan args yang saya inginkan, tetapi ketika saya memulai program dengan "r", program akan menunggu sampai saya mengetikkan sesuatu alih-alih membaca dari file yang ditentukan.
Cardiff space man
1
@cardiffspaceman, saya tidak bisa mengujinya dengan Cygwin - mungkin versi gdb mereka terbatas
maxschlepzig
Mengapa tidak hanya gdb -ex 'r -path /home/user/work < input.txt' myprogramdi varian ketiga?
Ruslan
@Ruslan, berfungsi juga - menggunakan 'set args ...' hanya memberi Anda kesempatan untuk secara interaktif menentukan beberapa break point, dll. Sebelum menjalankan program
maxschlepzig
Benar, tetapi Anda juga dapat menyetel breakpoint secara non-interaktif, mis gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan
6

Demi kelengkapan saat memulai sesi debugging, ada juga opsi --args. yaitu)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
vinc456.dll
sumber
14
Bagaimana Anda mengarahkan input.txt sebagai input ke yourprog setelah memulai sesi debugging seperti ini?
Peter Ajtai
1
@ Peter:gdb --args yourprog.out input.txt
Ben Elgar
1
Itu hanya bekerja jika "yourprog" mengharapkan nama file untuk menentukan masukan, bukan pengalihan masukan.
Alnitak
0

Dan jika Anda tidak perlu men-debug dari awal, Anda juga dapat melampirkan ke proses yang sudah berjalan dengan menggunakan:

$ gdb myprogram xxx

di mana xxx adalah id proses. Maka Anda tidak perlu memberi tahu gdb tentang argumen awal.

Zitrax
sumber
4
Anda ketinggalan menjawab judul pertanyaan, pada bagian "membaca stdin". Saya akan membuat komentar yang bagus di suatu tempat jika lebih pendek.
Notinlist