Как предотвратить gdb от управления захватом-D?

1 merlin2011 [2012-10-13 21:10:00]

Я пытаюсь отладить программу, которая должна читать EOF в качестве ввода.

Однако, когда я нажимаю Control-D для отправки EOF, когда программа запущена в GDB, GDB ловушка EOF и не передает ее в приложение.

Как я могу заставить gdb отправить EOF в приложение?

debugging linux gdb


1 ответ


1 Решение Employed Russian [2012-10-13 21:44:00]

Однако, когда я нажимаю Control-D для отправки EOF, когда программа запущена в GDB, GDB ловушка EOF и не передает ее в приложение.

GDB этого не делает.

В обычном (все-stop) режиме либо приложение, либо 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

Обновить:

Я нажимаю Control-D, когда приложение читает (а не в подсказке gdb), и приложение не признает, что оно получило Control-D. Когда приложение пытается прочитать, оно считывает 0 байт.

Это точно то, что должно было случиться (read возвращаемого 0 означает, что вы достигли конца файла). Если вы ожидаете, что приложение прочитает магический символ EOF, ваше ожидание неверно - такого символа нет.