Como você começa a executar o programa novamente no gdb com 'target remoto'?
Pergunta
Ao fazer uma sessão normal do gdb em um arquivo executável no mesmo computador, você pode dar o comando run e ele iniciará o programa novamente.
Quando você está executando o gdb em um sistema embarcado, como acontece com o comando target localhost:3210', como você inicia o programa novamente sem sair e reiniciar sua sessão do gdb?
Solução
Você está procurando Modo multiprocesso para gdbserver e set remote exec-file filename
Outras dicas
Infelizmente, não conheço uma maneira de reiniciar o aplicativo e ainda manter sua sessão.Uma solução alternativa é colocar o PC de volta no ponto de entrada do seu programa.Você pode fazer isso ligando para:
jump função
ou
set $pc=endereço
.
Se você munged os argumentos para main
pode ser necessário configurá-los novamente.
Editar:
Existem algumas advertências com o método acima que podem causar problemas.
- Se você estiver em um programa multithread, pular para main irá pular o thread atual para main, todos os outros threads permanecerão.Se o thread atual estiver bloqueado... então você terá alguns problemas.
- Vazamentos de memória, se o fluxo do programa alocar algumas coisas durante a inicialização, você simplesmente vazou um monte de memória com o salto.
- Os arquivos abertos ainda permanecerão abertos.Se você mapear alguns arquivos ou um endereço, a chamada provavelmente falhará.
Portanto, usar jump não é a mesma coisa que reiniciar o programa.
Presumivelmente você está executando o gdbserver no sistema embarcado.
Você pode pedir para reiniciar seu programa em vez de sair com alvo remoto estendido
"jump _start" é a maneira usual.
Para mim, o método descrito em 21.2 Exemplo de inicialização de sessão GDB funciona bem.Quando eu entro monitor reset halt
mais tarde, no prompt “(gdb)”, o hardware de destino é redefinido e posso reiniciar o aplicativo com c
(= continuar).
O load
O comando pode ser omitido entre as execuções porque não há necessidade de atualizar o programa repetidamente.
Procedimento passo a passo
Controlo remoto:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
Local:
# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
-ex 'set remote exec-file ./myexec' \
--args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit
Testado no Ubuntu 14.04.
Também é possível passar argumentos CLI para o programa como:
gdbserver --multi :1234 ./myexec arg1 arg2
e a ./myexec
parte elimina a necessidade de set remote exec-file ./myexec
, mas isso tem os seguintes incômodos:
- indocumentado: https://sourceware.org/bugzilla/show_bug.cgi?id=21981
- não aparece
show args
e não persiste nas reinicializações: https://sourceware.org/bugzilla/show_bug.cgi?id=21980
Passe variáveis de ambiente e altere o diretório de trabalho sem reiniciar: Como modificar as variáveis de ambiente e o diretório de trabalho do gdbserver --multi sem reiniciá-lo?
Se você estiver executando o gdb normal, você pode digitar o atalho 'run' 'r' e o gdb perguntará se você deseja reiniciar o programa
No EFM32 Happy Gecko nenhuma das sugestões funcionaria para mim, então aqui está o que aprendi na documentação sobre integração do GDB no ambiente Eclipse.
(gdb) mon reset 0
(gdb) continue
(gdb) continue
Isso me coloca no estado que eu esperaria ao redefinir o IDE.