comando para suspender un hilo con GDB

4 minutos de lectura

Soy un poco nuevo en GDB. Espero que alguien pueda ayudarme con algo que debería ser bastante simple, he usado Google/docs pero me falta algo.

¿Cuál es la forma ‘normal’ en que la gente depura aplicaciones con subprocesos con GDB? Estoy usando pthreads. Quiero ver solo un hilo: las dos opciones que veo son

a) decirle al depurador de alguna manera que se conecte a un subproceso en particular, de modo que el paso no resulte en subprocesos saltados en cada cambio de contexto

b) decirle al depurador que suspenda o libere cualquier subproceso ‘no interesante’

Preferiría ir a la ruta b) – leyendo la ayuda para GDB No veo un comando para esto, ¿consejos?

Consulte la documentación para set scheduler-locking on.

Tenga cuidado: si suspende otros subprocesos, y si uno de ellos tiene un bloqueo, y si su el hilo interesante necesita ese bloqueo en algún punto mientras camina, se bloqueará.

¿Cuál es la forma ‘normal’ en que la gente depura aplicaciones con subprocesos?

Nunca puede depurar la corrección del subproceso, solo puede diseñarlo. En mi experiencia, la mayor parte de la depuración de aplicaciones con subprocesos consiste en introducir aserciones y examinar el estado del mundo cuando se viola una de las aserciones.

  • por “normal” menciono más una cuestión de frecuencia de técnica que un “cómo” en la programación de subprocesos. en Windows, por lo general, veo personas que congelan uno o dos hilos que quieren ignorar mientras se enfocan en un hilo en particular. la técnica de ‘establecer el bloqueo del programador’ es algo opuesta

    – atascado

    18 de abril de 2011 a las 0:06


  • ¿Hay alguna manera de congelar solo un hilo? Solo veo opciones para apagar/encender

    – atascado

    18 de abril de 2011 a las 0:07

  • Para agregar a la respuesta del ruso empleado. La clave para la programación de subprocesos múltiples es evitarla tanto como sea posible. Solo exponga la menor cantidad de código que pueda y tendrá la oportunidad de hacerlo bien y poder analizarlo correctamente y revisarlo como un fragmento de código confinado.

    –David Bradley

    31 de julio a las 20:44

Avatar de usuario de Hi-Angel
Hola angel

Primero, debe habilitar un comportamiento cómodo para el depurador de subprocesos múltiples con los siguientes comandos. No tengo idea de por qué está deshabilitado de forma predeterminada.

set target-async 1
set non-stop on

Yo personalmente puse esos comandos en .gdbinit expediente. Hacen que todos sus comandos se apliquen solo al hilo actualmente enfocado. Nota: es posible que el hilo se esté ejecutando, por lo que debe pausarlo.

Para ver el hilo enfocado ejecute el thread.

Para cambiar a otro hilo, agregue el número del hilo, por ejemplo thread 2.

Para ver todos los hilos con su problema de números info thread.

Para aplicar un comando a un hilo en particular, emita algo como subproceso aplicar comando threadnum. P.ej thread apply 4 bt aplicará el comando backtrace a un subproceso número 4. thread apply all continue continúa todos los subprocesos en pausa.

Sin embargo, hay un pequeño problema: muchos comandos necesitan que el hilo esté en pausa. Conozco algunas formas de hacerlo:

  • interrupt comando: interrumpe la ejecución del hilo, acepta un número de un hilo para pausar, sin un argumento rompe el enfocado.
  • Establecer un punto de interrupción en algún lugar. Tenga en cuenta que puede establecer un punto de interrupción para un subproceso en particular, de modo que otros subprocesos lo ignoren, como romper lino hilo hilo hilo. P.ej break 25 thread 4.

También puede encontrar muy útil que puede establecer una lista de comandos que se ejecutarán cuando se alcance un punto de interrupción a través del comando commands — así, por ejemplo, puede imprimir rápidamente valores interesantes y luego continuar con la ejecución.

  • Gracias por los consejos. También encontré en un programa de subprocesos múltiples que usa un punto de interrupción condicional con una expresión compleja como b func if arg1->foo().bar().c_str() == "xxx" es muy raro ¿Alguna vez has utilizado esta técnica?

    –Lewis Chan

    19 de febrero de 2020 a las 2:21

  • Oh, para ser sincero, ni siquiera sabía que podías poner if condition en el interior break dominio. Solía ​​ejecutar primero break somewherey luego ejecutar commands, donde escribo la condición si. ¡Gracias por el consejo! 😉

    – Hola angel

    19 de febrero de 2020 a las 8:47

¿Ha sido útil esta solución?