c++ - ¿Cómo sabe GDB que tiene que romperse en un punto de quiebre específico?
(4)
Una pregunta básica y soy muy nuevo en C / C ++ y GDB.
Usamos GDB para depurar un proceso. Adjuntamos GDB a un proceso y luego especificamos filename.c junto con el número de línea para poner punto de corte.
Mi pregunta es "¿Cómo sabría GDB o OS o posiblemente otra cosa que tiene que romperse en un número de línea específico (en filename.c) después de conectar GDB al proceso en ejecución?"
¿Qué está entrando en la imagen de que, por ejemplo, el proceso actual se ejecuta en modo de depuración y se aplica un punto de interrupción y la ejecución del proceso debe interrumpirse (esperar la entrada del usuario) en ese punto?
De la misma manera que si su programa se detiene o se bloquea en un punto particular, el depurador puede indicarle en qué punto del programa se encuentra ese punto.
Para que ambos funcionen, el binario del programa debe contener información de depuración adicional que asocie direcciones en la imagen del programa con ubicaciones en el código fuente (archivo fuente y número de línea).
Para agregar un punto de interrupción en una línea particular, el depurador encuentra la dirección del programa más cercana a esa línea, modifica la copia del ejecutable en la memoria para insertar una instrucción especial de "interrupción" en esa ubicación que causará la interrupción de la ejecución del programa, luego " rastrea "la ejecución del programa y espera a que llegue al punto de interrupción y se detenga".
Para obtener más información, consulte http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ y http://www.howzatt.demon.co.uk/articles/SimplePTrace.html
GDB conoce tu código: lo sabe todo. Cuando establece un punto de interrupción en una línea, GDB obtiene la dirección de instrucción de la máquina equivalente: todo su código (como instrucciones de la máquina) se carga en la memoria, por lo que las instrucciones de su código tienen una dirección.
Entonces, ahora GDB conoce la dirección de la instrucción que quiere romper. Cuando ejecuta su programa, GDB usará ptrace, que le permite a GDB "ver" cada instrucción antes de su ejecución. Entonces GDB solo tiene que ver si la instrucción actual (que se ejecutará) es la misma que su instrucción (que quiere romper).
No puedo hacer ningún comentario sobre la última versión de gdb, pero muchos depuradores realmente intercambian las instrucciones de ensamblaje en la ubicación deseada del punto de interrupción (en la memoria) con una instrucción de interrupción. Esto "despierta" el depurador que toma el control en este punto.
El uso de una instrucción de interrupción sustituida significa que la CPU puede ejecutar su programa a toda velocidad y "disparar" en la ubicación deseada.
Los procesadores modernos son muy complejos, sin embargo, y probablemente tienen características de depuración muy superiores.
Si utilizó la opción -g en gcc / g ++, los números de línea de cada archivo fuente se adjuntan a las instrucciones en los archivos de objeto resultantes.