不久前,我将个人操作系统更改为linux,将开发环境更改为KDevelop。

但是,调试c++项目仍然无法正常工作。
我的KDevelop版本是4.2.2(我通过软件包管理安装了它)

每次我按下“调试按钮”时,应用程序都会以控制台消息启动warning: GDB: Failed to set controlling terminal: Operation not permitted和调试功能不可用。

任何想法都欢迎。

(如果您需要其他信息,请随时询问)

最佳答案

我也有这个问题,但是我在KDevelop中很少使用gdb,这还没有困扰我。这是我尝试修复的日志:

仔细查看GDB 7.3.1源代码,可以发现,当GDB尝试将其主TTY设置为新创建的伪tty时,将显示此消息(请参见gdb/inflow.c,第683-740行)。特别是,对带有请求TIOCSCTTY的ioctl的调用失败,并出现权限错误。

考虑到这一点,我查看了Linux内核源代码,以查看可能导致失败的原因。一点搜索表明它最终将退化为对tiocsctty()的调用。 tiocsctty的评论在这里很重要:

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

由于EPERM失败的唯一其他原因是GDB创建的tty实际上是另一个进程的控制tty(这似乎不太可能),因此我认为可以合理地假设GDB不是 session 领导者。公平地说,它毕竟是由KDevelop推出的!

因此:我尝试不在外部终端中启动GDB session ,并且它可以正常工作。问题缩小了。

最初,外部端子线设置为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如何实际设置终端。它运行shell脚本
tty > FIFO_PATH ; trap "" INT QUIT TSTP ; exec<&-; exec>&-; while :; do sleep 3600;done

然后将GDB设置为使用从FIFO_PATH读取的终端设备。 (顺便说一句,我的名字不是KDevelop使用的那个。)问题(据我所知)是gdb不是作为shell脚本的子级启动的,因此不能将其用作其主要tty。

我还不愿意修补KDevelop来使它正常工作(或者首先发现实际上导致它停止工作的原因……),所以目前我能建议的最好办法是根本不使用用于调试目的的外部终端。

祝你好运!如果发现有用的内容,我会进行更新。

关于c++ - KDevelop调试警告: Failed to set controlling terminal: Operation not permitted,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7407088/

10-13 08:16