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?

Foi útil?

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:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top