Как предотвратить 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
, ваше ожидание неверно - такого символа нет.