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.

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.


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.


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.