Linux 如何防止gdb捕获control-D?

Linux 如何防止gdb捕获control-D?,linux,debugging,gdb,Linux,Debugging,Gdb,我正在调试一个需要将EOF作为输入读取的程序 但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序 如何使gdb将EOF发送到应用程序 但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序 GDB不做任何这样的事情 在正常(全部停止)模式下,应用程序或GDB控制终端,但不能同时控制两者 如果应用程序正在读取终端输入,则Control-D将使其读取EOF,并且GDB不会对此进行干扰

我正在调试一个需要将EOF作为输入读取的程序

但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序

如何使gdb将EOF发送到应用程序

但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序

GDB不做任何这样的事情

在正常(全部停止)模式下,应用程序或GDB控制终端,但不能同时控制两者

如果应用程序正在读取终端输入,则Control-D将使其读取
EOF
,并且GDB不会对此进行干扰

如果您正在查看
(gdb)
提示符,那么应用程序没有读取输入——它被停止了——发送Control-D将确实向gdb发送
EOF
。不要那样做

例如:

gdb -q /bin/cat
Reading symbols from /bin/cat...done.

(gdb) run
Starting program: /bin/cat 
foof     # my input
foof     # cat output
         # Control-D
[Inferior 1 (process 12782) exited normally]  # cat received EOF and exited
(gdb) run
Starting program: /bin/cat 
foof     # my input
foof     # cat output
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7b31ee0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:82
82  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) quit   # I typed Control-D, GDB translated that into quit
A debugging session is active.

    Inferior 1 [process 12787] will be killed.

Quit anyway? (y or n) y
更新:


当应用程序正在读取时(不是在gdb提示符下),我正在点击Control-D,并且应用程序不确认它收到了Control-D。当应用程序尝试读取时,它读取0字节

这正是应该发生的事情(
read
返回0表示您已到达文件末尾)。如果您希望应用程序读取magical
EOF
symbol,那么您的期望是错误的——没有这样的符号

但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序

GDB不做任何这样的事情

在正常(全部停止)模式下,应用程序或GDB控制终端,但不能同时控制两者

如果应用程序正在读取终端输入,则Control-D将使其读取
EOF
,并且GDB不会对此进行干扰

如果您正在查看
(gdb)
提示符,那么应用程序没有读取输入——它被停止了——发送Control-D将确实向gdb发送
EOF
。不要那样做

例如:

gdb -q /bin/cat
Reading symbols from /bin/cat...done.

(gdb) run
Starting program: /bin/cat 
foof     # my input
foof     # cat output
         # Control-D
[Inferior 1 (process 12782) exited normally]  # cat received EOF and exited
(gdb) run
Starting program: /bin/cat 
foof     # my input
foof     # cat output
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7b31ee0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:82
82  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) quit   # I typed Control-D, GDB translated that into quit
A debugging session is active.

    Inferior 1 [process 12787] will be killed.

Quit anyway? (y or n) y
更新:


当应用程序正在读取时(不是在gdb提示符下),我正在点击Control-D,并且应用程序不确认它收到了Control-D。当应用程序尝试读取时,它读取0字节


这正是应该发生的事情(
read
返回0表示您已到达文件末尾)。如果您希望应用程序读取magical
EOF
symbol,那么您的期望是错误的——没有这样的符号。

ctrl-v ctrl-d有效吗?不,这只会让gdb想退出自己…您可以使用
M-x gdb
从内部
emacs
运行
gdb
;然后你有一个单独的Emacs缓冲区用于调试程序的输入和输出。ctrl-v ctrl-d有效吗?不,这只会让gdb想退出自己…你可以从
Emacs
内部运行
M-x gdb
;然后,您有一个单独的Emacs缓冲区用于调试程序的输入和输出。当应用程序正在读取时(不是在gdb提示符下),我正在点击Control-D,而应用程序不确认它收到了Control-D。当应用程序尝试读取时,它读取0字节。我刚刚编写了一个非常小的程序来隔离这个问题,看起来你是对的。在gdb下出现错误的是较大的应用程序(包括我没有编写的代码)。@merlin2011我已经更新了答案。较大的应用程序可能会错误地执行
EOF
检测。当应用程序正在读取时(不是在gdb提示下),我正在点击Control-D,并且应用程序不确认它收到了Control-D。当应用程序尝试读取时,它读取0字节。我刚刚编写了一个非常小的程序来隔离这个问题,看起来你是对的。在gdb下出现错误的是较大的应用程序(包括我没有编写的代码)。@merlin2011我已经更新了答案。较大的应用程序可能会错误地执行
EOF
检测。