Genellikle şu şekilde bir program çalıştırırım:
./a.out arg1 arg2 <file
Gdb kullanarak hata ayıklamak istiyorum.
set args
İşlevselliğin farkındayım , ancak bu sadece gdb isteminden çalışıyor.
Genellikle şu şekilde bir program çalıştırırım:
./a.out arg1 arg2 <file
Gdb kullanarak hata ayıklamak istiyorum.
set args
İşlevselliğin farkındayım , ancak bu sadece gdb isteminden çalışıyor.
Yanıtlar:
Bağımsız değişkenleri run
komuta gdb içinden iletin.
$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
$ gdb ./a.out
o zaman benim (gdb) r < t arg1 arg2
için iyi çalışıyor. Benim durumumda a.out = nft
arg1 = import
arg2 = json
vet = file containing json rules
Bunu yapabilirsiniz:
gdb --args path/to/executable -every -arg you can=think < of
Sihirli bit olmak --args
.
run
Hata ayıklamayı başlatmak için gdb komut konsolunu yazmanız yeterlidir.
--args
o zaman değil pek belirsiz yüzden yürütülebilir geçirilen herhangi argümanlar.
argv[0]
olarak çalıştırılabilir dosyanın adı olduğu için tahmin ediyorum
gdb
kendisini of
dosyaya yönlendirir ve gdb'nin komutları çalıştırmaya çalışmasına neden olur
Programınızı yeniden yönlendirme ve bağımsız değişkenlerle yürütmek için çıplak run
komut almak istiyorsanız gdb
, şunları kullanabilirsiniz set args
:
% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run
Ben --args
parametre ile aynı davranışı elde gdb
edemedim , şiddetle yönlendirmeler kaçar, yani
% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...
Bu aslında gdb'nin girdisini yönlendiriyor, burada gerçekten istediğimiz şeyi değil
% gdb --args echo 1 2 <file
zsh: no such file or directory: file
GDB'yi projenizde başlatın.
Proje yürütülebilir dosyasını zaten derlediğiniz proje dizinine gidin. Gdb komutunu ve yürütülebilir dosyanın adını aşağıdaki gibi verin:
gdb projectAraştırıcıadı
Bu, gdb'yi başlatır, aşağıdakileri yazdırır: GNU gdb (Ubuntu 7.11.1-0ubuntu1 ~ 16.04) 7.11.1 Telif Hakkı (C) 2016 Free Software Foundation, Inc. ............... .................................. "word" ile ilgili komutları aramak için "apropos word" yazın. ProjectExecutablename'den semboller okunuyor ... bitti. (Gdb)
Programınızı çalıştırmadan önce kesme noktalarını ayarlamak istersiniz. Break komutu bunu yapmanızı sağlar. Main adlı işlevin başında bir kesme noktası ayarlamak için:
(gdb) b ana
(Gdb) istemine sahip olduğunuzda, run komutu çalıştırılabilir çalıştırmayı başlatır. Hata ayıkladığınız program herhangi bir komut satırı bağımsız değişkeni gerektiriyorsa, bunları run komutuna belirtirsiniz. Programımı "xfiles" dosyasında (proje dizinindeki "mulder" klasöründe) çalıştırmak istiyorsanız, aşağıdakileri yaparsınız:
(gdb) r mulder / xfiles
Bu yardımcı olur umarım.
Yasal Uyarı: Bu çözüm benim değil, https://web.stanford.edu/class/cs107/guide_gdb.html adresinden uyarlanmıştır. Büyük olasılıkla gdb için kısa bir kılavuz Stanford Üniversitesi'nde geliştirilmiştir.
debug
Hata ayıklamak için herhangi bir komutun önüne yazmak iyi olmaz mıydıgdb
Kabuk düzeyinde ?
Altında bu fonksiyon. Hatta aşağıdakilerle çalışır:
"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)
Bu, hiçbir şeyi kontrol edemediğiniz, her şeyin değişken olduğu, boşluklar, satır beslemeleri ve kabuk metakarakterleri içerebileceği bir çağrıdır. Bu örnekte, in
, out
, two
, vethree
zarar olmamalıdır rasgele diğer tüketen komutlar veya ürünün verileridir.
Aşağıdaki bash
işlev gdb
böyle bir ortamda neredeyse temiz bir şekilde çalışır [ Gist ]:
debug()
{
1000<&0 1001>&1 1002>&2 \
0</dev/tty 1>/dev/tty 2>&0 \
/usr/bin/gdb -q -nx -nw \
-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
-ex r \
--args "$@";
}
Bunun nasıl uygulanacağına ilişkin örnek: Sadece yazın debug
Önden yeterlidir:
Önce:
p=($'\n' $'I\'am\'evil' " yay ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)
Sonra:
p=($'\n' $'I\'am\'evil' " yay ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)
Bu kadar. Şimdi hata ayıklamak için mutlak bir beyinsiz gdb
. Birkaç ayrıntı veya daha fazlası hariç:
gdb
otomatik olarak kapanmaz ve bu nedenle siz çıkana kadar IO yönlendirmesini açık tutar gdb
. Ama buna özellik diyorum.
İle kolayca argv0
programa geçemezsiniz exec -a arg0 command args
. Sonra: Bu hile yapmak gerekir takiben exec-wrapper
değişime "exec
karşı "exec -a \"\${DEBUG_ARG0:-\$1}\"
.
Normalde kapalı olan 1000'in üzerinde açık FD vardır. Bu bir sorunsa, 0<&1000 1>&1001 2>&1002
okumak için değiştirin0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-
Paralel olarak iki hata ayıklayıcı çalıştıramazsınız. Başka bir komut tüketildiğinde /dev/tty
(veya STDIN) sorunlar da olabilir . Bunu gidermek için değiştirin /dev/tty
ile "${DEBUGTTY:-/dev/tty}"
. Diğer bazı TTY türlerinde tty; sleep inf
ve sonra /dev/pts/60
olduğu gibi hata ayıklamak için basılı TTY'yi (i. E. ) kullanın DEBUGTTY=/dev/pts/60 debug command arg..
. Shell'in Gücü, buna alış!
Fonksiyon açıklaması:
1000<&0 1001>&1 1002>&2
ilk 3 FD'yi uzaklaştırır
0</dev/tty 1>/dev/tty 2>&0
geçerli TTY'nizi gösterecek şekilde ilk 3 FD'yi geri yükler. Böylece kontrol edebilirsiniz gdb
./usr/bin/gdb -q -nx -nw
kabuk üzerinde gdb
çağırır çalışırgdb
-ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\""
1000 ve üstüne kaydedilmiş ilk 3 FD'yi geri yükleyen bir başlangıç sarmalayıcısı oluşturur-ex r
kullanarak programı başlatır exec-wrapper
--args "$@"
argümanları verilen şekilde geçirirKolay değil miydi?
r
kısarun
ve herhangi bir argüman ile takip edebilirsiniz. Bu soruda olduğu gibi, şöyle olabilir:r arg1 arg2 <file
ya da olabilirrun arg1 arg2 <file