tutorial test subaru que online debuggear como c gdb

test - gdb-depuración con tubería



gdb tutorial (2)

Digamos que tengo dos programas llamados bla y ret . Quiero depurar el programa blah que recibe la entrada del programa ret a través de la redirección de E / S. ¿Cómo depuro el programa blah en el siguiente caso usando gdb?

bash> ret | blah


Al principio, puede ejecutar el programa y depurarlo pid. Esta solución, por supuesto, no cubre todos los casos.

Otro enfoque es usar las capacidades de Linux para la comunicación entre procesos. En resumen, usted redirige la salida de ret a un archivo especial FIFO ("named pipe") y luego lee de ese FIFO a través de un depurador. Así es como se hace. Desde bash, ejecuta:

mkfifo foo

Esto crea un archivo especial en su directorio que servirá como un conducto con nombre . Cuando escribe texto en este archivo (usando la misma sintaxis echo "Hello" >foo ), el programa de escritura se bloqueará hasta que alguien lea los datos del archivo ( cat <foo , por ejemplo). En nuestro caso, un proceso controlado por gdb leerá desde este archivo.

Después de crear un fifo, ejecuta desde bash:

ret > foo & # ampersand because it may block as nobody is reading from foo gdb blah

Luego, en el indicador gdb, ejecuta

run <foo

Y consigue el efecto deseado. Tenga en cuenta que no puede leer los datos de la fifo (ni tampoco de un conducto habitual) dos veces: cuando haya leído todos los datos, el proceso de blah fallece y debe repetir el comando escribiendo a foo (puede hacerlo) desde la otra ventana de shell).

Cuando termine, elimine el fifo con rm foo (o colóquelo en el directorio donde se eliminará automáticamente al reiniciar el sistema, como /tmp ).


El comando de run de GDB utiliza bash para realizar la redirección. Una forma simple de lograr el equivalente de ret | blah ret | blah es usar la función de sustitución de procesos de bash.

$ gdb blah ... (gdb) run < <(ret)

Explicación: bash substituye <(ret) con algo como /dev/fd/123 , que es un descriptor de archivo del stdout de ret . Podemos usar ese fd de manera similar a un FIFO con nombre como se describe en la otra respuesta, excepto que no tenemos que crearlo manualmente nosotros mismos, ni preocuparnos por la duración del proceso de ret .