Como carregar o programa lendo stdin e tomando parâmetros no gdb?

101

Eu tenho um programa que recebe entrada de stdin e também alguns parâmetros da linha de comando. Se parece com isso:

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

Tento depurar o código com gdb dentro do emacs, pelo Mx gdb, tento carregar o programa com o comando:

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

No entanto, gdb não gosta disso.

Pergunta resumida a partir daqui . Infelizmente não entendo a solução e não tenho certeza do que fazer além de compilar com a -gopção e executar o comando Mx gdb.

vinc456
fonte

Respostas:

132

Se você estivesse fazendo isso a partir de um shell, faria assim:

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

Isso parece funcionar no emacs também.

Alnitak
fonte
O redirecionamento parece funcionar, mas recebo alguns erros. Falha ao ler uma imagem de arquivo de objeto válido da memória. O programa foi encerrado com o código 042. Alguma ideia?
vinc456
Provavelmente é um erro geral do GDB e provavelmente nada a ver com o fato de você estar executando dentro do emacs. Aprenda como executar o GDB a partir de um shell primeiro (com uma nova pergunta, se necessário) e depois se preocupe em executá-lo dentro do emacs.
Alnitak
1
Eu descobri. Por alguma razão, digitei void main (int argc, char * argv []) em vez de "int main ..." e deslizei meu olho. De qualquer forma, tudo funciona bem agora; Obrigado pela ajuda!
vinc456
2
Um agradecimento tardio - o manual do gdb é um saco de escavar.
Excluído em
1
No Windows usando msys64 recebo <e input.txtcomo argvargumentos para meu programa :( Vou continuar pesquisando essas respostas com meu gdb 8.2.1: stackoverflow.com/questions/3544325/…
ixe013
32

Há várias maneiras de o fazer:

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

ou

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

ou

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

onde o runcomando gdb ( r) usa por padrão os argumentos definidos anteriormente com set args.

maxschlepzig
fonte
4
Quando tento fazer isso com gdb no cygwin, não funciona. O comando "show args" mostra que eu entrei nos args que queria, mas quando eu inicio o programa com "r", o programa espera até que eu digite coisas em vez de ler o arquivo especificado.
cardiff space man
1
@cardiffspaceman, bem, não posso testá-lo com o Cygwin - talvez a versão gdb deles seja de alguma forma limitada
maxschlepzig
Por que não simplesmente gdb -ex 'r -path /home/user/work < input.txt' myprogramna terceira variante?
Ruslan
@Ruslan também funciona - usar 'set args ...' apenas lhe dá a chance de definir interativamente alguns pontos de interrupção etc. antes de executar o programa
maxschlepzig
É verdade, mas você também pode definir o ponto de interrupção de forma não interativa, por exemplo gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan
6

Para fins de integridade, ao iniciar uma sessão de depuração, há também a opção --args. ie)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
vinc456
fonte
14
Como você redirecionaria o input.txt como uma entrada para o seu programa ao iniciar uma sessão de depuração como esta?
Peter Ajtai de
1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar
1
Isso só funciona se "yourprog" espera um nome de arquivo para especificar a entrada, não o redirecionamento de entrada.
Alnitak
0

E se você não precisa depurar desde o início, você também pode anexar a um processo já em execução usando:

$ gdb myprogram xxx

onde xxx é o id do processo. Então você não precisa informar ao gdb os argumentos iniciais.

Zitrax
fonte
4
Você deixou de responder ao título da pergunta, na parte "lendo stdin". Eu faria um bom comentário em algum lugar se fosse mais curto.
Notinlist de