it-swarm-pt.tech

Como você começa a executar o programa novamente em gdb com 'target remote'?

Quando você estiver executando uma sessão gdb comum em um arquivo executável no mesmo computador, poderá executar o comando run e ele iniciará o programa novamente.

Quando você está executando o gdb em um sistema incorporado, como no comando target localhost: 3210 ', como você inicia o programa novamente sem sair e reiniciar a sessão do gdb?

27
jfm3
10
pdileepa

Infelizmente, não sei como reiniciar o aplicativo e ainda manter sua sessão. Uma solução alternativa é restaurar o PC para o ponto de entrada do seu programa. Você pode fazer isso ligando para:

jump function

ou

set $pc=address.

Se você colocou os argumentos em main, pode ser necessário configurá-los novamente.

Editar:

Existem algumas ressalvas no método acima que podem causar problemas.

  • Se você estiver em um programa multithread, pular para main saltará o thread atual para main, todos os outros threads permanecerão. Se o encadeamento atual travou ... então você tem alguns problemas.
  • Vazamentos de memória, se você programar o fluxo aloca algumas coisas durante a inicialização, você apenas 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 o salto não é a mesma coisa que reiniciar o programa.

6
Drew Frezell

Presumivelmente, você está executando o gdbserver no sistema incorporado.

Você pode pedir para reiniciar o programa em vez de sair com target extended-remote

4
Employed Russian

"jump _start" é a maneira usual.

2
Michael Snyder

Para mim, o método descrito em 21.2 Exemplo de inicialização da sessão do GDB funciona muito bem. Quando eu insiro monitor reset halt mais tarde no prompt “(gdb)”, o hardware de destino é redefinido e posso reiniciar o aplicativo com c (= continue).

O comando load pode ser omitido entre as execuções, porque não há necessidade de atualizar o programa repetidamente.

2
hermannk

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 da CLI para o programa como:

gdbserver --multi :1234 ./myexec arg1 arg2

e a ./myexec parte remove a necessidade de set remote exec-file ./myexec, mas isso tem os seguintes aborrecimentos:

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 regular, digite 'run' shortcut 'r' e o gdb perguntará se você deseja reiniciar o programa

0
Jehandad

No EFM32 Happy Gecko, nenhuma das sugestões funcionaria para mim, então aqui está o que aprendi na documentação sobre a integração do GDB no ambiente Eclipse.

(gdb) mon reset 0
(gdb) continue
(gdb) continue

Isso me coloca no estado que eu esperaria ao pressionar redefinir a partir do IDE.

0
Steven Eckhoff