1

EOFを入力として読み取る必要があるプログラムをデバッグしようとしています。

ただし、プログラムがGDBで実行されているときにControl-Dを押してEOFを送信すると、GDBはEOFをトラップし、アプリケーションに渡しません。

gdbにEOFをアプリケーションに送信させるにはどうすればよいですか?

4

1 に答える 1

1

ただし、プログラムが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バイトを読み取ります。

それがまさに起こったはずのことです(read0を返すことは、ファイルの終わりに到達したことを意味します)。EOFアプリケーションが魔法の記号を読み取ることを期待している場合、あなたの期待は間違っています-そのような記号はありません。

于 2012-10-13T18:44:11.570 に答える