Hoe voer ik een programma uit met opdrachtregelargumenten met GDB in een Bash-script?

Als je een programma op GDB draait, worden de argumenten voor het programma meestal gegeven bij het runcommando. Is er een manier om het programma uit te voeren met GDB en ook om argumenten te geven binnen een shellscript?

Ik zag een antwoord in een gerelateerde vraag, waarin stond dat we GDB aan het programma kunnen koppelen nadat het script is uitgevoerd. Maar dan zal ik het programma moeten ‘wachten’.

Is er een andere manier om dit te doen?


Antwoord 1, autoriteit 100%

U kunt gdb uitvoeren met –args parameter,

gdb --args executablename arg1 arg2 arg3

Als je wilt dat het automatisch wordt uitgevoerd, plaats dan enkele commando’s in een bestand (bijvoorbeeld ‘run’) en geef het als argument: -x /tmp/cmds. Optioneel kunt u de -batch-modus gebruiken.

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

Antwoord 2, autoriteit 24%

gdb -ex=r --args myprogram arg1 arg2

-ex=ris een afkorting voor -ex=runen vertelt gdb om uw programma onmiddellijk uit te voeren, in plaats van te wachten tot u “run” typt bij de prompt . Dan zegt --argsdat alles wat volgt het commando en de argumenten zijn, net zoals je ze normaal zou typen bij de opdrachtregelprompt.


Antwoord 3, autoriteit 9%

Een andere manier om dit te doen, die ik persoonlijk iets handiger en intuïtiever vind (zonder de parameter --argste hoeven onthouden), is door normaal te compileren en r arg1 arg2 arg3rechtstreeks vanuit gdb, zoals:

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

Antwoord 4, autoriteit 2%

Je zou een bestand met context kunnen maken:

run arg1 arg2 arg3 etc
program input

En bel gdb zoals

gdb prog < file

Antwoord 5

Als de parameter --argsniet werkt op uw machine (d.w.z. op Solaris 8), kunt u gdb starten zoals

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

En je kunt dit combineren met het invoeren van een bestand naar stdin en “onmiddellijk starten”:

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

Antwoord 6

Veel te laat, maar hier is een methode die werkt tijdens de gdb-sessie.

gdb <executable>

dan

(gdb) apropos argument

Dit zal veel overeenkomsten opleveren, de handige is set args.

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

set args arg1 arg2 ...

dan

r

Hierdoor wordt het programma uitgevoerd, waarbij de argumenten en het aantal argumenten worden doorgegeven aan main(argc, argv).


Antwoord 7

gdb has --init-command <somefile>waar somefile een lijst met gdb-commando’s heeft om uit te voeren, ik gebruik dit om //GDBopmerkingen in mijn code, dan `

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

als een script, dat het commando plaatst om de debug-symbolen te laden, en vervolgens een lijst met break-commando’s genereert om een breekpunt te plaatsen voor elke //GDB-opmerking, en het te starten

p>


Antwoord 8

In aanvulling op het antwoord van Hugo Ideler.
Bij het gebruik van argumenten met een voorvoegsel als --of -, wist ik niet zeker of ik in conflict zou komen met gdb one.

Het lijkt erop dat gdb alle opties na argsals argumenten voor het programma gebruikt.

Eerst wilde ik het zeker weten, ik heb gdb uitgevoerd met aanhalingstekens rond je argumenten, het is verwijderd bij de lancering.

Dit werkt ook, maar optioneel:

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

Dit werkt niet :

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

In dat geval wordt -tuigebruikt als mijn programmaparameter en niet als gdb one.

Other episodes