【问题标题】:gdb trouble with stdin redirection标准输入重定向的 gdb 问题
【发布时间】:2011-02-26 13:47:44
【问题描述】:

我正在编写一个程序来通过网络实现 Dinic 的最大流量算法。网络可以手动编写,也可以使用标准输入重定向从文件加载。 我已经能够使用 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 错误?

【问题讨论】:

    标签: c redirect gdb stdin


    【解决方案1】:

    好的,我终于可以找到解决方法了。至少在我的情况下,--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
    

    而且效果很好。也许有人会觉得这很有用。

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并想出了相同的解决方案来指定运行中的 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时还要指定重定向

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      相关资源
      最近更新 更多