¿Cómo se empieza a ejecutar el programa nuevamente en gdb con 'objetivo remoto'?
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?
Solución
Estás buscando Modo multiproceso para gdbserver y set remote exec-file filename
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:
- indocumentado: https://sourceware.org/bugzilla/show_bug.cgi?id=21981
- no se muestra en
show args
y no persiste entre reinicios: https://sourceware.org/bugzilla/show_bug.cgi?id=21980
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.