Jak uruchomić program z argumentami wiersza polecenia przy użyciu GDB w skrypcie Bash?

428

Podczas uruchamiania programu w GDB zwykle argumenty programu są podawane w runpoleceniu. Czy istnieje sposób na uruchomienie programu przy użyciu GDB i podanie argumentów w skrypcie powłoki?

Zobaczyłem odpowiedź w powiązanym pytaniu, mówiąc, że możemy dołączyć GDB do programu po uruchomieniu skryptu. Ale wtedy będę musiał „poczekać” na program.

Czy jest na to inny sposób?

drox
źródło
2
możliwy duplikat Jak przekazać argumenty i przekierować standardowe wejście z pliku do programu uruchamianego w gdb?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

612

Możesz uruchomić gdb z parametrem --args,

gdb --args executablename arg1 arg2 arg3

Jeśli chcesz, aby działał automatycznie, umieść niektóre polecenia w pliku (np. „Uruchom”) i podaj jako argument: -x / tmp / cmds. Opcjonalnie możesz uruchomić w trybie -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Hugo Ideler
źródło
53
Argg man gdbnie zawiera --args, dlatego go nie znalazłem. gdb --helprobi.
Ciro Santilli 15 冠状 病 六四 事件 法轮功
1
@CiroSantilli 事件 改造 中心 法轮功 六四 事件 GDB to GNU. Aby zobaczyć pełną dokumentację narzędzi GNU, pamiętaj, aby użyć info gdbnastępnym razem :-).
Apteryx
1
@Apteryx może kiedyś się nauczę info. Jeśli Google lub Stack Overflow przestanie działać XD
Ciro Santilli 15 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Zahaczyłem o informacje po odkryciu klawisza „i” ( index-search). Spróbuj: info gdbnastępnie „i”, a następnie „--args”. Doprowadzi cię do tego.
Apteryx
138
gdb -ex=r --args myprogram arg1 arg2

-ex=rjest skrótem od -ex=runi mówi gdb, aby natychmiast uruchomił twój program, zamiast czekać na wpisanie „run” w wierszu polecenia. Następnie --argsmówi, że wszystko, co następuje, to polecenie i argumenty, tak jak zwykle wpisujesz je w wierszu polecenia.

Hugo
źródło
Nie wiedziałem o -exe=rbardzo przydatnym!
Jeef
46

Innym sposobem na zrobienie tego, co osobiście uważam za nieco wygodniejsze i intuicyjne (bez konieczności zapamiętywania --argsparametru), jest kompilacja normalna i używanie r arg1 arg2 arg3bezpośrednio z wewnątrz gdb, na przykład:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
źródło
23
Właśnie tego OP ma nadzieję uniknąć.
KarateSnowMachine
6
Hmmm, tak, dziękuję, słuszna racja. Nie jestem pewien, jak to tak długo umknęło mojej uwadze. Myślę jednak, że zostawię tutaj odpowiedź, ponieważ iirc natknąłem się na to pytanie, gdy przejrzałem coś w stylu „Jak przekazywać argumenty wiersza poleceń za pomocą gdb”, a ponieważ nie znalazłem odpowiedzi, dodałem ją , nie zdając sobie sprawy (przez prawie rok!), że moja odpowiedź nie dotyczyła omawianego pytania.
aspiring_sarge
2
@KarateSnowMachine Jak ktoś przybywający z Google, ta odpowiedź jest bardziej zgodna z tym, czego szukałem. Być może powinniśmy zmienić pytanie, aby było bardziej ogólne, ponieważ ma tak ogólny tytuł, a może powinniśmy zawęzić tytuł. Zmniejszenie ograniczeń byłoby prawdopodobnie bardziej przydatne dla większej liczby czytelników.
jpmc26,
18

Możesz utworzyć plik z kontekstem:

run arg1 arg2 arg3 etc

program input

I zadzwoń do gdb jak

gdb prog < file
George Kastrinis
źródło
4

gdb ma --init-command <somefile>tam, gdzie jakiś plik ma listę poleceń gdb do uruchomienia, używam tego, aby mieć //GDBkomentarze w moim kodzie, a następnie `

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

jako skrypt, który umieszcza polecenie w celu załadowania symboli debugowania, a następnie generuje listę poleceń przerwania w celu ustalenia punktu przerwania dla każdego //GDBkomentarza i uruchamia go

Austin_Anderson
źródło
4

Jeśli --argsparametr nie działa na twoim komputerze (tj. W Solarisie 8), możesz uruchomić gdb jak

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

Możesz to połączyć z wprowadzeniem pliku do standardowego wejścia i „natychmiastowym uruchomieniem”:

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
Johannes
źródło
2

Oprócz odpowiedzi Hugo Ideler. Używając argumentów mających sam prefiks, takich jak --lub -, nie byłem pewien, czy mam konflikt z jednym z gdb.

Wygląda na to, że gdb zajmuje wszystko args opcję jako argumenty dla programu.

Na początku chciałem się upewnić, uruchomiłem gdb z cytatami wokół twoich argumentów, jest on usuwany przy uruchomieniu.

To też działa, ale opcjonalnie:

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

To nie działa:

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

W takim przypadku -tuijest używany jako parametr mojego programu, a nie jako gdb.

Sandburg
źródło
1

O wiele za późno, ale tutaj jest metoda, która działa podczas gdbsesji.

gdb <executable>

następnie

(gdb) apropos argument

Zwróci to wiele dopasowań, przydatnym jest set args.

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

set args arg1 arg2 ...

następnie

r

Spowoduje to uruchomienie programu, przekazując do argumentu main (argc, argv) argumenty i liczbę argumentów.

Alinsoar
źródło