Como executo um programa com argumentos de linha de comando usando o GDB em um script Bash?

428

Ao executar um programa no GDB, geralmente, os argumentos para o programa são fornecidos no runcomando. Existe uma maneira de executar o programa usando o GDB e fornecer argumentos em um script de shell?

Vi uma resposta em uma pergunta relacionada, mencionando que podemos anexar o GDB ao programa após o início da execução do script. Mas então terei que 'esperar' o programa.

Há outra maneira de fazer isso?

drox
fonte

Respostas:

612

Você pode executar o gdb com o parâmetro --args,

gdb --args executablename arg1 arg2 arg3

Se você deseja que ele seja executado automaticamente, coloque alguns comandos em um arquivo (por exemplo, 'run') e dê-o como argumento: -x / tmp / cmds. Opcionalmente, você pode executar com o modo -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Hugo Ideler
fonte
53
Argg, man gdbnão contém --args, é por isso que não o encontrei. gdb --helpfaz.
Ciro Santilli foi lançado
1
@CiroSantilli. 改造 GN 法轮功 六四 事件 GDB é GNU. Para visualizar a documentação completa das ferramentas GNU, lembre-se de usar da info gdbpróxima vez :-).
Apteryx 15/01
1
@Apteryx talvez um dia eu aprenda info. Se o Google ou o Stack Overflow parar de funcionar com o XD
Ciro Santilli
1
@CiroSantilli 事件 改造 中心 法轮功 六四 事件 Fiquei viciado em informações depois de descobrir a tecla 'i' ( index-search). Tente info gdb:, então 'i', depois '--args'. Isso o levará direto a isso.
Apteryx 15/01
139
gdb -ex=r --args myprogram arg1 arg2

-ex=ré uma abreviação de -ex=rune diz ao gdb para executar seu programa imediatamente, em vez de esperar que você digite "run" no prompt. Em seguida, --argsdiz que tudo o que se segue é o comando e os argumentos, assim como você os digitaria normalmente no prompt da linha de comando.

Hugo
fonte
Não sabia sobre o -exe=rmuito útil!
Jeef 14/02
46

Outra maneira de fazer isso, que eu pessoalmente acho um pouco mais conveniente e intuitiva (sem precisar lembrar o --argsparâmetro), é compilar normalmente e usar r arg1 arg2 arg3diretamente de dentro gdb, da seguinte forma:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
fonte
23
É exatamente isso que o OP espera evitar ter que fazer.
KarateSnowMachine
6
Hmmm, sim, obrigado, ponto justo. Não tenho certeza de como isso escapou da minha atenção por tanto tempo. Eu acho que vou deixar a resposta aqui, no entanto, porque iirc, me deparei com essa pergunta quando pesquisei algo como "Como passar argumentos de linha de comando usando gdb" e, encontrando a resposta ausente, continuei adicionando-a , sem perceber (por quase um ano!) que minha resposta não abordou a questão em questão.
que você
2
@KarateSnowMachine Como alguém que chega do Google também, essa resposta é mais parecida com o que eu estava procurando. Talvez devêssemos revisar a questão para ser mais geral, pois ela tem um título geral, ou talvez devêssemos restringir o título. Torná-lo menos restritivo provavelmente seria mais útil para o maior número de leitores.
Jpmc26
18

Você pode criar um arquivo com contexto:

run arg1 arg2 arg3 etc

program input

E chame gdb como

gdb prog < file
George Kastrinis
fonte
4

O gdb tem --init-command <somefile>onde somefile tem uma lista de comandos do gdb para executar, eu uso isso para ter //GDBcomentários no meu código e depois `

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

como um script, que coloca o comando para carregar os símbolos de depuração e, em seguida, gera uma lista de comandos de interrupção para colocar um ponto de interrupção para cada //GDBcomentário e inicia a execução

Austin_Anderson
fonte
4

Se o --argsparâmetro não estiver funcionando na sua máquina (por exemplo, no Solaris 8), você poderá iniciar o gdb como

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

E você pode combinar isso com a inserção de um arquivo no stdin e a "execução imediata":

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

Além da resposta de Hugo Ideler. Ao usar argumentos com o prefixo de si mesmo como --ou -, não tive certeza de entrar em conflito com o gdb one.

Parece que o gdb aceita todas as argsopções depois como argumentos para o programa.

No começo eu queria ter certeza, corri o gdb com aspas em torno de seus argumentos, que é removido no lançamento.

Isso funciona também, mas é opcional:

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

Isso não funciona:

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

Nesse caso, -tuié usado como parâmetro do meu programa e não como gdb one.

Sandburg
fonte
1

Tarde demais, mas aqui está um método que funciona durante a gdbsessão.

gdb <executable>

então

(gdb) apropos argument

Isso retornará muitas correspondências, a útil é set args.

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

set args arg1 arg2 ...

então

r

Isso executará o programa, passando para o main (argc, argv) os argumentos e a contagem de argumentos.

alinsoar
fonte