Bash betiği içinde GDB kullanarak komut satırı bağımsız değişkenleri olan bir programı nasıl çalıştırabilirim?


428

GDB'de bir program çalıştırırken, genellikle programın argümanları runkomutta verilir . GDB kullanarak programı çalıştırmanın ve bir kabuk betiği içinde argümanlar vermenin bir yolu var mı?

İlgili bir soruda, kod çalıştırılmaya başladıktan sonra programa GDB ekleyebileceğimizi belirten bir cevap gördüm. Ama sonra programı 'beklemem' gerekecek.

Bunu yapmanın başka bir yolu var mı?


Yanıtlar:


612

Gdb'yi --args parametresiyle çalıştırabilir,

gdb --args executablename arg1 arg2 arg3

Otomatik olarak çalışmasını istiyorsanız, bazı komutları bir dosyaya yerleştirin (örneğin, 'run') ve bağımsız değişken olarak verin: -x / tmp / cmds. İsteğe bağlı olarak -batch moduyla çalıştırabilirsiniz.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

53
Argg, man gdbiçermiyor --args, bu yüzden bulamadım. gdb --helpyapar.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1
@CiroSantilli B 改造 中心 is 六四 事件 GDB GNU'dur. GNU araçlarının tam belgelerini görüntülemek için bir info gdbdahaki sefere kullanmayı unutmayın :-).
Apteryx

1
@Apteryx belki bir gün öğreneceğim info. Google veya Yığın Taşması durursa XD
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1
@CiroSantilli i 改造 中心 法轮功 六四 事件 'i' tuşunu ( index-search) keşfettikten sonra bilgiye bağlandım . Deneyin:, info gdbsonra 'i', sonra '--args'. Seni buna getirecek.
Apteryx

138
gdb -ex=r --args myprogram arg1 arg2

-ex=rkısaltmasıdır -ex=runve komut istemine "run" yazmanızı beklemek yerine gdb'ye programınızı hemen çalıştırmasını söyler. Ardından --args, normalde bunları komut satırı istemine yazdığınız gibi, takip eden her şeyin komut ve bağımsız değişkenler olduğunu söyler.


-exe=rÇok yararlı olduğunu bilmiyordum !
Jeef

46

Kişisel olarak ( --argsparametreyi hatırlamak zorunda kalmadan) biraz daha rahat ve sezgisel bulduğum başka bir yol, normal olarak derlemek ve r arg1 arg2 arg3doğrudan içinden içinden kullanmaktır gdb:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3

23
OP tam olarak bunu yapmaktan kaçınmayı umuyor.
KarateSnowMachine

6
Hmmm, evet, teşekkür ederim, adil nokta. Bunun benim bildirimimden ne kadar uzun süre kaçtığından emin değilim. Ancak cevabı burada bırakacağımı düşünüyorum, çünkü iirc, "gdb kullanarak komut satırı argümanlarını nasıl geçiririm" gibi bir şeyi googledim ve cevabı eksik bulduğumda bu soruyu tökezledim, eklemeye devam ettim , (neredeyse bir yıl boyunca!) cevabımın bu soruyu ele almadığını fark etmeden.
aspiring_sarge

2
@KarateSnowMachine Google'dan gelen biri olarak, bu cevap daha çok aradığım şey boyunca. Belki de genel bir başlık olduğu için soruyu daha genel olacak şekilde gözden geçirmeliyiz, ya da belki başlığı daraltmalıyız. Daha az kısıtlayıcı hale getirmek, muhtemelen daha fazla sayıda okuyucu için daha yararlı olacaktır.
jpmc26

18

İçeriğe sahip bir dosya oluşturabilirsiniz:

run arg1 arg2 arg3 etc

program input

Ve gdb'yi şöyle çağır

gdb prog < file

4

gdb, --init-command <somefile>somefile'ın çalıştırılacak gdb komutlarının bir listesine sahip olduğunu, bunu kodumda //GDByorum yapmak için kullanıyorum , sonra ``

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

komut dosyası olarak, hata ayıklama simgelerini yükleme komutunu koyar ve ardından her //GDByorum için bir kesme noktası koymak üzere kesme komutlarının bir listesini oluşturur ve çalışmaya başlar.


4

Eğer --argsparametre makinenizde çalışmıyor (Solaris 8 yani), şöyle gdb başlayabilir

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

Ve bunu stdin'e bir dosya girerek ve "hemen çalış" ile birleştirebilirsiniz:

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

2

Hugo Ideler'in yanıtı. Kullanıcının kendisi öneki gibi olan argümanlar kullanırken --veya -ben gdb biriyle çatışma emin değildi.

Görünüşe göre gdb her şeyden sonra argsprogram için argümanlar olarak alıyor .

İlk başta emin olmak istedim, gdb'yi argümanlarınızda tırnak işaretleri ile çalıştırdım, lansman sırasında kaldırıldı.

Bu da işe yarıyor, ancak isteğe bağlı:

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

Bu işe yaramaz:

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

Bu durumda, -tuiprogram parametresi olarak gdb biri olarak kullanılmaz.


1

Çok geç, ama burada gdboturum sırasında çalışan bir yöntem var .

gdb <executable>

sonra

(gdb) apropos argument

Bu, çok sayıda eşleşme döndürür, yararlı olanıdır set args.

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

set args arg1 arg2 ...

sonra

r

Bu, argümanları ve argüman sayısını ana (argc, argv) ileterek programı çalıştıracaktır.

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.