El subproceso de C ++ no se detiene en el modo asíncrono de gdb utilizando la secuencia de comandos de python definida por el usuario

Estoy usando gdb 7.4.1 en el destino powerpc incorporado para realizar un análisis en mi progtwig de C ++ de múltiples subprocesos que utiliza pthreads. Mi objective final es escribir gdb con python para automatizar algunas funciones de análisis comunes. El problema es que estoy encontrando alguna discrepancia en el comportamiento cuando ejecuto comandos individualmente en un comando gdb definido por el usuario (o invoco los mismos comandos a través de un script de python).

edición: encontré esta referencia a un problema muy similar en la lista de correo principal de gdb. Aunque no sigo completamente la respuesta de Pedro sobre la limitación del modo asíncrono, creo que está implicando que en el modo asíncrono, no se puede confiar en el tiempo relativo de las secuencias de comandos definidas por el usuario. Esto es lo que encontré empíricamente.

En ambos escenarios, realizo los siguientes pasos de inicio, cargando mi progtwig, configurando sus argumentos y activando los modos de depuración asíncronos y sin interrupciones, luego ejecutando el progtwig en segundo plano:

(gdb) file myprogram (gdb) set args --interface=eth0 --try-count=0 (gdb) set target-async on (gdb) set pagination off (gdb) set non-stop on (gdb) run & 

En este punto, si emito manualmente los comandos de interrupt y luego info threads , veo la lista de todos los subprocesos en ejecución, excepto uno que se detuvo. Entonces puedo continue & y repetir el contenido de mi corazón, funciona de manera consistente. Cuando se detiene, puedo inspeccionar los marcos de stack de ese hilo y todo está bien.

Sin embargo, si en cambio pongo estos comandos en un comando gdb definido por el usuario:

     (gdb) define foo (gdb) interrupt (gdb) info threads (gdb) continue & (gdb) end (gdb) foo Cannot execute this command while the selected thread is running. 

    Luego, la lista de subprocesos impresa por foo indica que no se detuvieron subprocesos, por lo que el comando continue & retorna Cannot execute this command while the selected thread is running. . Pensé que este era un problema inherente al comando asíncrono de gdb, así que inserté una espera absurdamente larga después del comando de interrupción y obtuve el mismo comportamiento:

     (gdb) define foo (gdb) interrupt (gdb) shell sleep 5 (gdb) info threads (gdb) continue & (gdb) end (gdb) foo Cannot execute this command while the selected thread is running. 

    Con o sin el comando de suspensión, siempre puedo emitir los comandos de CLI manuales y los subprocesos se detienen correctamente.

    De manera similar, obtengo los mismos resultados al obtener una secuencia de comandos de Python para hacer la lectura del hilo:

     import gdb, time gdb.execute("file myprogram") gdb.execute("set args --interface=eth0 --try-count=0") gdb.execute("set target-async on") gdb.execute("set pagination off") gdb.execute("set non-stop on") gdb.execute("run &") time.sleep(5) gdb.execute("interrupt") # here, I inspect threads via gdb module interface # in practice, they're always all running bc the program neven got interrupted for thread in gdb.selected_inferior().threads(): print thread.is_running(), gdb.execute("continue &") 

    Obtengo el mismo resultado incluso si especifico from_tty=True en las llamadas a gdb.execute . Además, si uso continue -a , suprime la cadena de error pero no ayuda, de lo contrario, la llamada de interrupción aún no funciona.

    Asi es esto:

    • error en la cabina? ¿Hay algo que estoy omitiendo o haciendo incorrectamente, dado lo que estoy tratando de lograr? ¿Debería esto funcionar, o tengo que usar GDB / MI para “manejar” gdb de forma asíncrona?
    • un problema de tiempo? Tal vez invocar shell sleep (o python time.sleep() ) no hace lo que asumo que haría, en este contexto.
    • ¿Problema con mi uso de pthreads? He asumido que, dado que el uso manual de los comandos gdb siempre funciona correctamente, este no es el caso.
    • un problema de gdb?

    Gracias.

    Creo que este es probablemente un problema de gdb. No sé lo suficiente sobre las cosas de control inferior para tener más confianza. Sé que el control inferior generalmente no se ha conectado a Python …

    Una cosa que vale la pena intentar es tener un hilo de Python separado que haga la espera, luego envía un comando de “interrupción” al hilo principal de gdb usando gdb.post_event.

    Luego, en lugar de examinar sincrónicamente los subprocesos o hacer el trabajo después de la “interrupción”, use el origen de eventos gdb.events.stop para desencadenar sus acciones.

    Por favor, archiva los errores libremente sobre los agujeros en la API de Python.