KDevelop调试警告:设置控制终端失败:不允许操作

Myt*_*hli 7 c++ debugging gdb kdevelop

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

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

每次我点击"调试按钮"时,应用程序都会从​​控制台消息开始, warning: GDB: Failed to set controlling terminal: Operation not permitted并且调试功能不可用.

欢迎任何想法.

(如果您需要其他信息,请不要犹豫)

Eth*_*eal 21

我也遇到过这个问题,但是我在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.
 */
Run Code Online (Sandbox Code Playgroud)

因为EPERM失败的唯一原因是,如果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".
Run Code Online (Sandbox Code Playgroud)

我检查了我的权限; 我的用户是tty组的一部分,所有相关文件都是可读写的.

浏览KDevelop源代码可以了解KDevelop如何实际设置终端.它运行shell脚本

tty > FIFO_PATH ; trap "" INT QUIT TSTP ; exec<&-; exec>&-; while :; do sleep 3600;done
Run Code Online (Sandbox Code Playgroud)

然后设置GDB以使用它从FIFO_PATH读取的终端设备.(顺便说一下,我的名字,而不是KDevelop使用的那个.)问题(我能说的最好)是gdb不是作为shell脚本的子代启动的,因此不能将它作为主要的tty使用.

我还没有意识到修补KDevelop以使其正常工作(或者找到实际上导致它首先停止工作的原因......),所以我现在建议的最好的就是不要使用用于调试目的的外部终端.

祝好运!如果我发现任何有用的东西,我会更新.

  • 而你的回复只有+54?马上就在我的推特上!多么好/完美的反馈 (2认同)