2010-06-01 17 views
6

Sto scrivendo un programma per implementare l'algoritmo Maxic Flow di Dinic su una rete. Le reti possono essere scritte a mano o caricate da un file utilizzando il reindirizzamento stdin. Sono stato in grado di usare gdb per eseguire il debug del programma con file di piccole dimensioni (circa 30 righe), ma ho problemi quando provo a eseguire il debug del programma con file più grandi (> 1000 righe). Il codice stesso è questo:problemi con gdb stdin reindirizzamento

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); 
} 

Se faccio funzionare il programma senza gdb, si corre, non ok in quanto genera un errore di segmentazione (che è la ragione per cui sto cercando di utilizzare gdb), ma passa attraverso questa parte di "analizzare" il file di input (e scriverlo nel file di debug di output). Tuttavia, se di tipo I:

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

ottengo:

(gdb) Program exited with 01 code. 

e quando ho aperto il file di debug E 'di circa 2000 righe, quando dovrebbe essere al massimo di 1000, che è la lunghezza del file di input .

Ripeto, questo succede con i file "grandi", funziona correttamente con quelli piccoli. La domanda sarebbe: manco qualcosa quando uso gdb, o si tratta di un bug gdb?

risposta

7

Ok, potrei finalmente ottenere un lavoro. Sembra che l'opzione --args non funzioni bene, almeno nel mio caso. Ho gdb 6.8-debian e debian 5.0.4.

cosa che dovevo fare era gestito gdb senza l'opzione --args:

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

e ha funzionato bene. Forse qualcuno può trovare questo utile.

+0

Si noti che questo non funziona con MinGW su Windows, come descritto qui: http://stackoverflow.com/a/3652530/47984 (e come già sperimentato da me con gdb 7.7.1 di MinGW proprio ora). –

2

Ho avuto lo stesso problema e ho trovato la stessa soluzione per specificare args in esecuzione. L'opzione --args può solo passare argomenti, ma non può fare il reindirizzamento di stdin che è solitamente (in contesto non di debug) reindirizzato per te dalla shell che invoca il comando. Nella sessione di debug il tuo comando è invocato da gdb dove sia l'elenco di argomenti sia i reindirizzamenti sono specificati dal valore della variabile args. Usando l'opzione --args si inizializza questa variabile (e anche il file di programma per eseguire il debug). Basta fare

(gdb) show args 

e questo dovrebbe essere inizializzato a --mode=NUM --verbose=LOW nel tuo caso. Ma nessun reindirizzamento, quindi li specifichi con run, che sovrascrive gli argomenti! Quindi, avete due opzioni:

  1. specificare anche il reindirizzamento in args:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in 
    
  2. specificare anche il reindirizzamento quando si richiama run

Problemi correlati