在Linux中以交互方式打开和关闭输出?

时间:2016-08-02 20:45:44

标签: linux gdb

为了控制Linux上的输出,有control-s和control-t,它提供了一种暂时停止终端输出然后恢复它的方法。此外,在VMS上还有control-O,可以打开和关闭所有输出。这没有暂停输出,它丢弃了它。

Linux中是否有等效的键盘快捷键?

当调试输出数百万个状态行的程序时,这在gdb中经常出现。能够暂时将大部分内容发送到/ dev / null而不是屏幕,然后进一步接收输出流,在它们之间省去几百万行是非常方便的。

(编辑:termios(3)手册页提到VDISCARD - 然后说它不能在POSIX或Linux中工作。所以看起来这对于一般命令行使用来说是不可能的linux .gdb可能仍然可以通过它自己的命令丢弃输出。可以吗?)

感谢。

1 个答案:

答案 0 :(得分:0)

  

在VMS上还有控制-O ......

这个功能似乎并不存在于我曾经处理过的任何UNIX系统上(或者我可能从来不知道它存在;它已在FreeBSD man page中记录,并且也被Solaris和HP-UX文档引用。

  

gdb可能仍然能够通过其自己的命令丢弃输出。可以吗?

我不相信:GDB实际上并没有拦截来自劣质(正在调试)过程的输出,它只是让它运行(在断点之间),劣质输出转到它的任何地方&#39去吧。

那就是说,可以自己做:

#include <stdio.h>
int main()
{
  int i;
  for (i = 0; i < 1000; ++i) {
    printf("%d\n", i);
  }
}

gcc -g foo.c
gdb -q ./a.out

(gdb) break 6
Breakpoint 1 at 0x40053e: file foo.c, line 6.

(gdb) run 20>/dev/null    # run the program, file descriptor 20 goes to /dev/null

Starting program: /tmp/a.out 20>/dev/null

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);
(gdb) c
Continuing.
0

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);

我们现在运行两次迭代。让我们阻止100次迭代的进一步输出:

(gdb) call dup2(20, 1)
$1 = 1
(gdb) ign 1 100
Will ignore next 100 crossings of breakpoint 1.
(gdb) c
Continuing.

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);
(gdb) p i
$2 = 102

根据需要无输出。现在让我们恢复输出:

(gdb) call dup2(2, 1)
$3 = 1
(gdb) ign 1 10
Will ignore next 10 crossings of breakpoint 1.
(gdb) c
Continuing.
102
103
104
105
106
107
108
109
110
111
112

Breakpoint 1, main () at foo.c:6
6       printf("%d\n", i);

输出已恢复!