Отладка приложения ncurses с помощью gdb
Я пытаюсь отладить мое приложение ncurses, используя gdb. Я использую команду tty для перенаправления ввода / вывода программы на другой терминал. Вывод работает как шарм, но у меня проблемы с вводом. Я использую функцию getch() для получения символов в моем приложении. Так, например, если я делаю в моей сессии GDB:
tty /dev/pts/5
Я получаю вывод в другой вкладке моего окна терминала (gnome-терминал). Мои сеансы GDB застревают, ожидая ввода, но когда я нажимаю любую клавишу в моем /dev/pts/5, я распечатываю ее, но само приложение не делает этого, кроме как символа ввода. При работе без GDB все работает нормально, я также использую noecho(), поэтому символы не должны отображаться. Так в чем проблема? Можно ли как-то обработать ввод с перенаправленного терминала?
2 ответа
Вы можете присоединиться к своему процессу для отладки с другого терминала, вместо того, чтобы пытаться запустить приложение изнутри gdb
,
Запустите ваш процесс как обычно. Когда он заблокирован для пользовательского ввода, найдите его идентификатор процесса, а затем присоедините к нему с помощью gdb
из другого окна:
gdb -p <PID>
Ваша проблема связана с тем, что программа по-прежнему ожидает, что ее интерактивный ввод поступит от вашего gdb
сессия.
Может быть, уже поздно отвечать, но надеюсь, что это поможет: потребовалось некоторое время, чтобы выяснить, как отлаживать приложения ncurses, наконец, я сделал очень удобный способ с помощью gdbserver и tmux.
Таким образом, ввод-вывод GDB и приложения полностью разделены:
debug.sh (скрипт, который начинает отладку):
#!/bin/bash
tmux splitw -h -p 50 "gdbserver :12345 ./yourapplication"
tmux selectp -t 0
gdb -x debug.gdb
debug.gdb (однострочный файл сценария gdb для удобства):
target remote localhost:12345
Таким образом, приложение запускается с правой стороны, GDB слева ожидает продолжения или любой другой обычный GDB:)
Как только вы выйдете, tmux автоматически закроет gdbserver (следовательно, и правую панель) и все:)