web-development-kb-es.site

¿Cómo empiezas a ejecutar el programa nuevamente en gdb con 'target remote'?

Cuando está haciendo una sesión gdb habitual en un archivo ejecutable en la misma computadora, puede dar el comando de ejecución e iniciará el programa nuevamente.

Cuando ejecuta gdb en un sistema integrado, como con el comando target localhost: 3210 ', ¿cómo inicia el programa nuevamente sin salir y reiniciar su sesión de gdb?

27
jfm3
10
pdileepa

Desafortunadamente, no conozco una forma de reiniciar la aplicación y aún así mantener su sesión. Una solución alternativa es volver a configurar la PC en el punto de entrada de su programa. Puede hacerlo llamando a:

jump function

o

set $pc=address.

Si modificó los argumentos a main, es posible que necesite configurarlos nuevamente.

Editar:

Hay un par de advertencias con el método anterior que podrían causar problemas.

  • Si está en un programa de subprocesos múltiples, saltar a main saltará el hilo actual a main, todos los otros hilos permanecen. Si el hilo actual mantuvo un bloqueo ... entonces tienes algunos problemas.
  • Pérdidas de memoria, si el flujo del programa asigna algunas cosas durante la inicialización, entonces solo se filtró un montón de memoria con el salto.
  • Los archivos abiertos seguirán abiertos. Si asigna algunos archivos o una dirección, la llamada probablemente fallará.

Entonces, usar jump no es lo mismo que reiniciar el programa.

6
Drew Frezell

Presumiblemente está ejecutando gdbserver en el sistema integrado.

Puede pedirle que reinicie su programa en lugar de salir con target extended-remote

4
Employed Russian

"jump _start" es la forma habitual.

2
Michael Snyder

Para mí, el método descrito en 21.2 Ejemplo de inicio de sesión GDB funciona muy bien. Cuando entro monitor reset halt más tarde en el mensaje "(gdb)" se restablece el hardware de destino y puedo reiniciar la aplicación con c (= continuar).

El comando load se puede omitir entre las ejecuciones porque no hay necesidad de actualizar el programa una y otra vez.

2
hermannk

Procedimiento paso a paso

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

Probado en Ubuntu 14.04.

También es posible pasar argumentos CLI al programa como:

gdbserver --multi :1234 ./myexec arg1 arg2

y el ./myexec parte elimina la necesidad de set remote exec-file ./myexec, pero esto tiene las siguientes molestias:

Pase las variables de entorno y cambie el directorio de trabajo sin reiniciar: ¿Cómo modificar las variables de entorno y el directorio de trabajo de gdbserver --multi sin reiniciarlo?

Si está ejecutando gdb normal, puede escribir 'run' shortcut 'r' y gdb le pregunta si desea reiniciar el programa

0
Jehandad

En EFM32 Happy Gecko, ninguna de las sugerencias funcionaría para mí, así que esto es lo que aprendí de la documentación sobre la integración de GDB en el entorno Eclipse.

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

Esto me pone en el estado que esperaba al presionar restablecer desde el IDE.

0
Steven Eckhoff