Saya biasanya menjalankan program sebagai:
./a.out arg1 arg2 <file
Saya ingin men-debug menggunakan gdb.
Saya mengetahui set args
fungsinya, tetapi itu hanya berfungsi dari prompt gdb.
Lewati argumen ke run
perintah dari dalam gdb.
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
r
adalah kependekan darirun
dan Anda dapat mengikutinya dengan argumen apa pun. Seperti dalam pertanyaan ini, bisa jadi:r arg1 arg2 <file
atau bisa jugarun arg1 arg2 <file
$ gdb ./a.out
maka(gdb) r < t arg1 arg2
yang bekerja dengan baik bagi saya. Dalam kasus sayaa.out = nft
arg1 = import
arg2 = json
dant = file containing json rules
Kamu bisa melakukan ini:
Yang ajaib itu
--args
.Cukup ketik
run
konsol perintah gdb untuk memulai debugging.sumber
--args
maka tidak ada argumen yang diteruskan ke executable, jadi hampir tidak ambigu.argv[0]
adalah nama yang dapat dieksekusigdb
dirinya keof
file dan menghasilkan gdb yang mencoba mengeksekusi perintah darinyaJika Anda ingin memiliki
run
perintah kosonggdb
untuk menjalankan program Anda dengan pengalihan dan argumen, Anda dapat menggunakanset args
:Saya tidak dapat mencapai perilaku yang sama dengan
--args
parameter,gdb
dengan hebat lolos dari pengalihan, yaituYang ini sebenarnya mengarahkan ulang input gdb itu sendiri, bukan yang sebenarnya kita inginkan di sini
sumber
Mulai GDB di proyek Anda.
Pergi ke direktori proyek, di mana Anda telah menyusun executable proyek. Keluarkan perintah gdb dan nama yang dapat dieksekusi seperti di bawah ini:
gdb projectExecutablename
Ini memulai gdb, mencetak yang berikut: GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 Hak cipta (C) 2016 Free Software Foundation, Inc. ............... .................................. Ketikkan "kata apropos" untuk mencari perintah yang terkait dengan "kata" .. Membaca simbol dari projectExecutablename ... selesai. (gdb)
Sebelum Anda mulai menjalankan program, Anda ingin mengatur breakpoint Anda. Perintah break memungkinkan Anda untuk melakukannya. Untuk mengatur breakpoint di awal fungsi bernama main:
(gdb) b utama
Setelah Anda memiliki prompt (gdb), perintah run mulai menjalankan yang dapat dieksekusi. Jika program yang Anda debug membutuhkan argumen baris perintah, Anda menentukannya untuk menjalankan perintah. Jika Anda ingin menjalankan program saya pada file "xfiles" (yang ada di folder "mulder" di direktori proyek), Anda akan melakukan hal berikut:
(gdb) r mulder / xfiles
Semoga ini membantu.
Penafian: Solusi ini bukan milik saya, ini diadaptasi dari https://web.stanford.edu/class/cs107/guide_gdb.html Panduan singkat untuk gdb ini, kemungkinan besar, dikembangkan di Universitas Stanford.
sumber
Bukankah lebih baik mengetikkan saja
debug
di depan perintah apa saja untuk dapat men-debug dengangdb
pada tingkat shell?Di bawahnya fungsi ini. Ia bahkan bekerja dengan mengikuti:
Ini adalah panggilan di mana Anda tidak dapat mengontrol apa pun, semuanya variabel, dapat berisi spasi, umpan baris, dan karakter meta shell. Dalam contoh ini,
in
,out
,two
, danthree
sewenang-wenang perintah lain yang mengkonsumsi atau data hasil yang tidak boleh dirugikan.Berikut
bash
memanggil fungsigdb
hampir bersih di lingkungan seperti [ Intisari ]:Contoh tentang cara menerapkan ini: Cukup ketik
debug
di depan:Sebelum:
Setelah:
Itu dia. Sekarang ini adalah no-brainer untuk di-debug
gdb
. Kecuali untuk beberapa detail atau lebih:gdb
tidak berhenti secara otomatis dan karenanya menjaga pengalihan IO terbuka sampai Anda keluargdb
. Tetapi saya menyebutnya fitur.Anda tidak dapat dengan mudah beralih
argv0
ke program seperti denganexec -a arg0 command args
. Berikut ini harus melakukan trik ini: Setelahexec-wrapper
berubah"exec
menjadi"exec -a \"\${DEBUG_ARG0:-\$1}\"
.Ada FD di atas 1000 terbuka, yang biasanya ditutup. Jika ini masalah, ubah
0<&1000 1>&1001 2>&1002
untuk membaca0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-
Anda tidak dapat menjalankan dua debugger secara paralel. Mungkin juga ada masalah, jika beberapa perintah lain mengkonsumsi
/dev/tty
(atau STDIN). Untuk memperbaikinya, ganti/dev/tty
dengan"${DEBUGTTY:-/dev/tty}"
. Dalam beberapa jenis TTY laintty; sleep inf
dan kemudian gunakan TTY yang dicetak (i. E./dev/pts/60
) untuk debugging, seperti padaDEBUGTTY=/dev/pts/60 debug command arg..
. Itulah Kekuatan Shell, biasakanlah!Fungsi menjelaskan:
1000<&0 1001>&1 1002>&2
menjauh 3 FD pertama0</dev/tty 1>/dev/tty 2>&0
mengembalikan 3 FD pertama untuk menunjuk ke TTY Anda saat ini. Jadi kamu bisa mengendalikangdb
./usr/bin/gdb -q -nx -nw
menjalankangdb
memanggilgdb
pada shell-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\""
membuat pembungkus startup, yang mengembalikan 3 FD pertama yang disimpan hingga 1000 ke atas-ex r
memulai program menggunakanexec-wrapper
--args "$@"
melewati argumen seperti yang diberikanBukankah itu mudah?
sumber