gdb与stdin重定向有关

时间:2010-06-01 21:57:05

标签: c redirect gdb stdin

我正在编写一个程序,通过网络实现Dinic的max-flow算法。网络可以手动编写,也可以使用stdin重定向从文件加载。 我已经能够使用gdb用小文件(大约30行)调试程序,但是当我尝试使用更大的文件(> 1000行)调试程序时遇到了麻烦。代码本身是这样的:

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错误?

2 个答案:

答案 0 :(得分: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

它运作良好。也许有人会觉得这很有用。

答案 1 :(得分:3)

我遇到了同样的问题,并提出了相同的解决方案来指定运行中的args。选项--args只能传递参数,但不能重定向stdin,这通常(在非调试上下文中)由shell调用命令重定向。在调试会话中,您的命令由gdb调用,其中两个参数列表和重定向由args变量的值指定。通过使用--args选项,您可以初始化此变量(以及要调试的程序文件)。只是做

(gdb) show args

在您的情况下,这应该初始化为--mode=NUM --verbose=LOW。但是没有重定向,所以你用run指定它们,这会覆盖args!所以你有两个选择:

  1. 还指定args中的重定向:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in
    
  2. 在调用run

  3. 时也指定重定向