Pregunta

Me gustaría saber de dónde dentro de un enorme se imprime aplicación de un determinado mensaje. La aplicación es tan grande y antigua que utiliza todas las formas concebibles de impresión de texto al terminal; por ejemplo printf (), fprintf (stdout, ...), etc.

escribo para poner un punto de interrupción en la llamada al sistema write (), pero luego Estoy inundado con demasiadas paradas de punto de interrupción debido a diversas archivo de E / S de escritura que utilizan () también.

Así que, básicamente quiero GDB para detener cada vez que el programa imprime algo a la terminal, pero al mismo tiempo no quiero GDB se detenga cuando el programa escribe algo en un archivo.

¿Fue útil?

Solución

Utilice un punto de interrupción condicional que comprueba el primer parámetro. En los sistemas x86 de 64 bits la condición sería:

(BGF) b escritura si 1 == $ RDI

En los sistemas de 32 bits, es más complejo porque el parámetro está en la pila, lo que significa que usted necesita para emitir $ esp a un parámetro fd int * y el índice. La pila en ese punto tiene la dirección de retorno, la longitud, tampón y finalmente fd.

Esto varía mucho entre plataformas de hardware.

Otros consejos

Con GDB 7.0, puede establecer punto de interrupción condicionada a la llamada al sistema write ():

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

$ EBX contiene primer parámetro syscall - Número FD aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top