Linux 如何防止gdb捕获control-D?
我正在调试一个需要将EOF作为输入读取的程序 但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序 如何使gdb将EOF发送到应用程序 但是,当我在GDB中运行程序时点击Control-D发送EOF时,GDB会捕获EOF,而不会将其传递给应用程序 GDB不做任何这样的事情 在正常(全部停止)模式下,应用程序或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不会对此进行干扰
如果您正在查看(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表示您已到达文件末尾)。如果您希望应用程序读取magicalEOF
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表示您已到达文件末尾)。如果您希望应用程序读取magicalEOF
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
检测。