¿Cómo puedo poner un punto de interrupción en "algo se imprime en el terminal" en gdb?
printf breakpoints (2)
Me gustaría saber desde dónde se imprime un determinado mensaje dentro de una gran aplicación. La aplicación es tan grande y antigua que utiliza todas las formas posibles de imprimir texto en el terminal; por ejemplo, printf (), fprintf (stdout, ...) etc.
Escribo para poner un punto de interrupción en la llamada al sistema write () pero luego estoy saturado con demasiadas paradas de punto de interrupción debido a varias operaciones de E / S de archivos que también usan write ().
Básicamente, quiero que gdb se detenga cada vez que el programa imprime algo en el terminal, pero al mismo tiempo no quiero que gdb se detenga cuando el programa escribe algo en un archivo.
Con gdb 7.0, puede establecer un punto de interrupción condicional en syscall write ():
(gdb) catch syscall write
Catchpoint 1 (syscall ''write'' [4])
(gdb) condition 1 $ebx==1
$ ebx contiene el primer parámetro syscall - número de FD aquí
Use un punto de interrupción condicional que verifique el primer parámetro. En sistemas x86 de 64 bits, la condición sería:
(gdb) b escribe si 1 == $ rdi
En sistemas de 32 bits, es más complejo porque el parámetro está en la pila, lo que significa que debe convertir $ esp a un int * e indexar el parámetro fd. La pila en ese punto tiene la dirección de retorno, la longitud, el búfer y finalmente fd.
Esto varía mucho entre las plataformas de hardware.