embedded gdb debugging

embedded - ¿Cómo se vuelve a ejecutar el programa en gdb con ''destino remoto''?



debugging (8)

Cuando estás haciendo una sesión gdb habitual en un archivo ejecutable en la misma computadora, puedes dar el comando de ejecución y se iniciará el programa otra vez.

Cuando ejecutas gdb en un sistema integrado, como con el comando target localhost: 3210 '', ¿cómo comienzas el programa otra vez sin parar y reiniciar tu sesión de gdb?


"jump _start" es la forma habitual.


Desafortunadamente, no sé de ninguna manera para reiniciar la aplicación y aún mantener tu sesión. Una solución es volver a configurar la PC en el punto de entrada de su programa. Puedes hacer esto llamando a:

jump function

o

set $pc= address .

Si mandaste los argumentos a main es posible que necesites configurarlos nuevamente.

Editar:

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

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

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


En EFM32 Happy Gecko ninguna de las sugerencias me funcionaría, así que aquí está lo que aprendí de la documentación sobre la integración de GDB en el entorno de Eclipse.

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

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


Es de suponer que está ejecutando gdbserver en el sistema integrado.

Puede solicitar que reinicie su programa en lugar de salir con el objetivo remoto-extendido


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

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


Si está ejecutando gdb regularmente, puede escribir ''ejecutar'' atajo ''r'' y gdb le pregunta si desea reiniciar el programa


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 (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 ./prog elimina la necesidad de set remote exec-file ./myexec , pero tiene las siguientes molestias:

Pasar variables de entorno y cambiar el directorio de trabajo sin reiniciar: ¿cómo modificar las variables de entorno y el directorio de trabajo de gdbserver --multi sin reiniciarlo?