2010-06-01 55 views
6

我正在編寫一個程序,通過網絡實現Dinic的最大流算法。網絡可以通過手動編寫,也可以使用標準輸入重定向從文件加載。 我已經能夠使用gdb使用小文件(大約30行)來調試程序,但是當我嘗試用更大的文件(> 1000行)調試程序時遇到了問題。代碼本身是這樣的:gdb與標準輸入重定向的問題

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

如果我沒有運行GDB的程序,它運行時,也不行,因爲它產生分段錯誤(這是我想要使用GDB的原因),但它通過這部分「解析」輸入文件(並將其寫入輸出調試文件)。 不過,如果我輸入:

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

我得到:

(gdb) Program exited with 01 code. 

,當我打開調試文件,它是關於2000線,當它應該最多是1000,這是輸入文件長度。

我再說一遍,這發生在「大」文件中,它適用於小文件。 問題是,我在使用gdb的時候丟失了什麼,或者這是一個gdb的bug?

回答

7

好吧,我終於可以得到解決辦法。看起來--args選項運行不好,至少在我的情況下。我有gdb 6.8-debian和debian 5.0.4。

我不得不這樣做沒有--args選項已運行GDB:

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

,效果不錯。也許有人可以找到這個有用的。

+0

請注意,這不符合MinGW的工作時,在Windows上,如下所述:http://stackoverflow.com/a/3652530/47984(和我剛剛使用MinGW的gdb 7.7.1一樣)。 – 2014-08-21 15:06:50

2

我有同樣的問題,並提出了相同的解決方案來指定運行中的參數。選項--args只能傳遞參數,但不能執行stdin的重定向,它通常(在非調試環境中)通過調用該命令的shell重定向到您。在調試會話中,您的命令由gdb調用,其中均爲參數列表和重定向由變量args的值指定。通過使用--args選項,初始化該變量(並調試程序文件)。只要做

(gdb) show args 

這應該被初始化爲--mode=NUM --verbose=LOW你的情況。但是沒有重定向,所以你用run來指定它們,這會覆蓋參數!所以,你有兩個選擇:

  1. 指定也重定向在args:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in 
    
  2. 還指定重定向調用run