¿Cómo se empieza a ejecutar el programa nuevamente en gdb con 'objetivo remoto'?

StackOverflow https://stackoverflow.com/questions/75255

  •  09-06-2019
  •  | 
  •  

Pregunta

Cuando esté realizando una sesión gdb habitual en un archivo ejecutable en la misma computadora, puede dar el comando ejecutar y el programa se iniciará nuevamente.

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

¿Fue útil?

Otros consejos

Desafortunadamente, no conozco una manera de reiniciar la aplicación y aún mantener la sesión.Una solución alternativa es configurar la PC nuevamente al punto de entrada de su programa.Puedes hacerlo llamando al:

jump función

o

set $pc=DIRECCIÓN.

Si mutilaras los argumentos para main es posible que necesites 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 principal saltará el subproceso actual a principal, todos los demás subprocesos permanecerán.Si el hilo actual tenía un candado... entonces tienes algunos problemas.
  • Pérdidas de memoria, si el flujo de su programa asigna algunas cosas durante la inicialización, entonces simplemente perdió un montón de memoria con el salto.
  • Los archivos abiertos seguirán estando abiertos.Si asigna algunos archivos o una dirección, lo más probable es que la llamada falle.

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

Presumiblemente está ejecutando gdbserver en el sistema integrado.

Puede pedirle que reinicie su programa en lugar de salir con objetivo remoto extendido

"jump _start" es la forma habitual.

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

El load El comando se puede omitir entre ejecuciones porque no es necesario actualizar el programa una y otra vez.

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 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 'ejecutar' el acceso directo 'r' y gdb le preguntará si desea reiniciar el programa.

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 coloca en el estado que hubiera esperado al presionar restablecer desde el IDE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top