EOFを入力として読み取る必要があるプログラムをデバッグしようとしています。
ただし、プログラムがGDBで実行されているときにControl-Dを押してEOFを送信すると、GDBはEOFをトラップし、アプリケーションに渡しません。
gdbにEOFをアプリケーションに送信させるにはどうすればよいですか?
ただし、プログラムがGDBで実行されているときにControl-Dを押してEOFを送信すると、GDBはEOFをトラップし、アプリケーションに渡しません。
GDBはそのようなことはしません。
通常の(オールストップ)モードでは、アプリケーションまたはGDBのいずれかが端末を制御しますが、両方を制御することはできません。
アプリケーションが端末入力を読み取っている場合、Control-Dによって読み取りEOF
が行われ、GDBはそれを妨害しません。
プロンプトを見ている場合(gdb)
、アプリケーションは入力を読み取っていません(停止しています)。Control-Dを送信すると、実際EOF
にGDBに送信されます。そうしないでください。
例:
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を返すことは、ファイルの終わりに到達したことを意味します)。EOF
アプリケーションが魔法の記号を読み取ることを期待している場合、あなたの期待は間違っています-そのような記号はありません。