2010-06-01 13 views
6

Estoy escribiendo un programa para implementar el algoritmo de flujo máximo de Dinic en una red. Las redes pueden escribirse a mano o cargarse desde un archivo usando stdin redirection. He podido usar gdb para depurar el programa con archivos pequeños (alrededor de 30 líneas), pero estoy teniendo problemas cuando trato de depurar el programa con archivos más grandes (> 1000 líneas). El código en sí mismo es la siguiente:problema de gdb con la redirección stdin

uint32_t read_lines = 0; 
while(!feof(stdin)) 
{ 
    err = fscanf(stdin, "%u %u %u\n", &n1, &n2, &c); 
    if (err != 3) 
    { 
     printf("read_lines=%u\n", read_lines); /*for debugging purposes*/ 
    } 
    read_lines += 1; 
    /* write to debug file */ 
    fprintf(debug, "line %u: %u %u %u\n", read_lines, n1, n2, c); 
} 

Si corro el programa sin GDB, se ejecuta, no bien, ya que genera un fallo de segmentación (que es la razón por la que estoy tratando de utilizar GDB), y sale a través esta parte de "analizar" el archivo de entrada (y escribirlo en el archivo de depuración de salida). Sin embargo, si escribo:

gdb --args ./dinic --mode=NUM --verbose=LOW 
(gdb) b 61 
(gdb) run < tests/numterc.in 

me sale:

(gdb) Program exited with 01 code. 

y cuando abro el archivo de depuración que es alrededor de 2000 líneas, cuando debería ser como máximo 1000, que es la longitud del archivo de entrada .

Repito, esto sucede con los archivos "grandes", funciona correctamente con los pequeños. La pregunta sería, ¿me estoy perdiendo algo cuando uso gdb, o es esto un error gdb?

Respuesta

7

Ok, finalmente pude obtener una solución alternativa. Parece que la opción --args no está funcionando bien, al menos en mi caso. Tengo gdb 6.8-debian y debian 5.0.4.

Lo que tenía que hacer era correr gdb sin la opción --args:

$gdb ./dinic 
(gdb) b 61 
(gdb) run --mode=NUM --verbose=LOW < tests/numterc.in 

y funcionó bien. Tal vez alguien pueda encontrar esto útil.

+0

Tenga en cuenta que esto no funciona con MinGW en Windows, como se describe aquí: http://stackoverflow.com/a/3652530/47984 (y como lo experimenté con el gdb 7.7.1 de MinGW). –

2

Tuve el mismo problema y se me ocurrió la misma solución para especificar args en ejecución. La opción --args solo puede pasar argumentos, pero no puede hacer la redirección de stdin que normalmente es (en un contexto sin depuración) redirigida para usted por el intérprete de comandos que invoca el comando. En la sesión de depuración su comando es invocado por gdb donde tanto la lista de argumentos como las redirecciones están especificadas por el valor de la variable args. Al usar la opción --args, inicializa esta variable (y el archivo de programa para depurar también). Sólo hacer

(gdb) show args 

y esto debe ser inicializado a --mode=NUM --verbose=LOW en su caso. Pero no hay redirección, por lo que los especifica con run, ¡que anula los argumentos! Así que hay dos opciones:

  1. especificar también el cambio de dirección en args:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in 
    
  2. especificar también el cambio de dirección cuando se invoca run

Cuestiones relacionadas