Program okuma stdin yüklenir ve gdb'de parametreler nasıl alınır?


101

Stdin'den girdi alan ve ayrıca komut satırından bazı parametreler alan bir programım var. Şöyle görünüyor:

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

Emacs içindeki gdb ile kodda hata ayıklamaya çalışıyorum, Mx gdb ile programı şu komutla yüklemeye çalışıyorum:

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

Ancak, gdb bundan hoşlanmıyor.

Soru cribbed burada . Maalesef çözümü anlamıyorum ve -gseçenekle derlemenin ve Mx gdb komutunu çalıştırmanın ötesinde ne yapacağımı bilmiyorum .

Yanıtlar:


132

Bunu bir kabuktan yapıyor olsaydın, şöyle yapardın:

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

Bu, emacs içinde de işe yarıyor gibi görünüyor.


Yeniden yönlendirme çalışıyor gibi görünüyor ancak bazı hatalar alıyorum. Bellekten geçerli bir nesne dosyası görüntüsü okunamadı. Program 042 koduyla çıkıldı. Herhangi bir fikriniz var mı?
vinc456

Bu muhtemelen genel bir GDB hatasıdır ve muhtemelen emacs içinde çalıştığınız gerçeğiyle hiçbir ilgisi yoktur. Önce bir kabuktan GDB'yi nasıl çalıştıracağınızı öğrenin (gerekirse yeni bir soru ile) ve ardından onu emacs içinde çalıştırma konusunda endişelenin.
Alnitak

1
Bunu anladım. Nedense "int main ..." yerine void main (int argc, char * argv []) yazdım ve gözümden kaydı. Neyse şimdi her şey yolunda gidiyor; yardımınız için teşekkürler!
vinc456

2
Gecikmiş bir teşekkür ederim - gdb kılavuzu, derinlemesine araştırılması gereken bir acıdır.
Silinmiş

1
, Windows msys64 kullanarak ben almak <ve input.txtolarak argvprogramıma argümanlar :( benim gdb 8.2.1 ile bu cevapları etrafında kazma devam edeceğiz: stackoverflow.com/questions/3544325/...
ixe013

32

Bunu yapmanın birkaç yolu var:

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

veya

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

veya

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

Burada gdb runcommand ( r) varsayılan olarak argümanları önceden ayarlanmış olduğu gibi kullanır set args.


4
Bunu cygwin'de gdb ile denediğimde işe yaramıyor. "Show args" komutu istediğim argümanları girdiğimi gösteriyor, ancak programı "r" ile başlattığımda, program belirtilen dosyadan okumak yerine bir şeyler yazana kadar bekliyor.
cardiff space man

1
@cardiffspaceman, pekala, Cygwin ile test edemiyorum - belki de gdb sürümleri bir şekilde sınırlıdır
maxschlepzig

Neden sadece gdb -ex 'r -path /home/user/work < input.txt' myprogramüçüncü varyantta değil?
Ruslan

@Ruslan da işe yarıyor - 'set args ...' kullanmak size sadece programı çalıştırmadan önce bazı kırılma noktalarını vb. Etkileşimli olarak tanımlama şansı veriyor
maxschlepzig

Doğru, ancak kesme noktasını etkileşimsiz olarak da ayarlayabilirsiniz, örn gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan

6

Bir hata ayıklama oturumu başlatıldığında bütünlük adına --args seçeneği de vardır. yani)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
Bunun gibi bir hata ayıklama oturumu başlattığınızda, input.txt dosyasını programınıza girdi olarak nasıl yönlendirirsiniz?
Peter Ajtai

1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar

1
Bu, yalnızca "programınız" bir dosya adının giriş yeniden yönlendirmesini değil girişi belirtmesini beklerse çalışır.
Alnitak

0

Ve en baştan hata ayıklamanız gerekmiyorsa, şu komutu kullanarak zaten çalışan bir işleme de ekleyebilirsiniz:

$ gdb myprogram xxx

burada xxx, işlem kimliğidir. O zaman gdb'ye başlangıç ​​argümanlarını söylemenize gerek yoktur.


4
"Standart okuma" bölümünde soru başlığını cevaplamayı kaçırdınız. Daha kısa olsaydı bir yerde güzel bir yorum yapardım.
Notinlist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.