Предупреждение об отладке KDevelop: Не удалось установить управляющий терминал: Операция не разрешена - PullRequest
7 голосов
/ 13 сентября 2011

Некоторое время назад я изменил свою персональную операционную систему на linux, а среду разработки на KDevelop.

Однако отладка проектов на c ++ все еще не работает должным образом. Моя версия KDevelop - 4.2.2 (я установил ее через управление пакетами)

Каждый раз, когда я нажимаю "кнопку отладки", приложение запускается с сообщением консоли warning: GDB: Failed to set controlling terminal: Operation not permitted и функция отладки недоступна.

Любые идеи приветствуются.

(если вам нужна дополнительная информация, не стесняйтесь спрашивать)

Ответы [ 3 ]

21 голосов
/ 16 сентября 2011

У меня тоже была эта проблема, но я редко использую GDB в KDevelop, что меня еще не беспокоило. Вот мой журнал попыток исправить это:

Просмотр исходного кода GDB 7.3.1 показывает, что это сообщение печатается, когда GDB пытается установить свой главный TTY на вновь созданный псевдо-tty (см. Gdb / inflow.c, строки 683-740). В частности, вызов ioctl с запросом TIOCSCTTY завершается с ошибкой прав доступа.

Имея это в виду, я взглянул на исходный код ядра Linux, чтобы понять, что может вызвать сбой. Немного поиска показывает, что он в конечном итоге выродится в вызов tiocsctty (). Важный комментарий от tiocsctty:

/*
 * The process must be a session leader and
 * not have a controlling tty already.
 */

Поскольку единственная другая причина, по которой он может потерпеть неудачу с EPERM, - это если tty, который создает GDB, на самом деле является контрольным tty для другого процесса (что весьма маловероятно), я счел разумным предположить, что GDB не лидер сессии. Вполне справедливо, что он запущен KDevelop в конце концов!

Итак: я пытался не запускать сеанс GDB во внешнем терминале, и он работает. Проблема сузилась.

Первоначально внешняя линия терминала была установлена ​​на konsole --noclose --workdir %workdir -e %exe. Изменение этого значения на terminator -e %exe немного изменило: KDevelop предупредил меня, что

GDB cannot use the tty* or pty* devices.
Check the settings on /dev/tty* and /dev/pty*
As root you may need to "chmod ug+rw" tty* and pty* devices and/or add the user to the tty group using "usermod -G tty username".

Я проверил свои разрешения; мой пользователь был частью группы tty, и все соответствующие файлы были доступны для чтения и записи.

Просмотр исходного кода KDevelop показывает, как KDevelop фактически настраивает терминал. Он запускает скрипт оболочки

tty > FIFO_PATH ; trap "" INT QUIT TSTP ; exec<&-; exec>&-; while :; do sleep 3600;done

и затем настраивает GDB на использование терминального устройства, которое оно считывает из FIFO_PATH. (Кстати, мое имя не то, которое использует KDevelop.) Проблема (насколько я могу судить) состоит в том, что gdb не запускается как дочерний элемент сценария оболочки и поэтому не может использовать его в качестве основного tty.

Я пока не чувствую, что исправляю KDevelop, чтобы заставить эту работу работать должным образом (или вначале не могу найти причину, по которой это перестало работать ...), поэтому лучшее, что я могу предложить сейчас, это просто не используйте внешний терминал для отладки.

Удачи! Я обновлю, если найду что-нибудь полезное.

1 голос
/ 28 июля 2018

Как сказал Артур Зенниг, для получения дополнительной информации вам нужно что-то сделать

  1. Во-первых, вам необходимо создать профиль терминала

enter image description here

Во-вторых, откройте Launch Configurations, заполните информацию, такую ​​как изображение ниже

enter image description here

Удачи!

0 голосов
/ 22 октября 2017

В случае, если вы получили ошибку:

"Не могу получить консоль tty / pty. Проверьте, что консоль на самом деле терминал и что он принимает эти аргументы "

RUN> КОНФИГУРАЦИЯ ЛАУЧЕРОВ> (см. Рисунок ниже. Мой проект назывался «loops») Для меня сработало снятие флажка «Использовать внешний терминал». Найдена во вкладке «Скомпилированные двоичные файлы».

image Configure Laucher">

...