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

时间:2011-09-13 19:05:01

标签: c++ debugging gdb kdevelop

前段时间我将个人操作系统改为linux,将我的开发环境改为KDevelop。

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

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

欢迎任何想法。

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

3 个答案:

答案 0 :(得分: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.
 */

由于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".

我检查了我的权限;我的用户是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使用。 / p>

我现在还不想修补KDevelop以使其正常工作(或者找到实际上导致它首先停止工作的原因......),所以我现在建议的最好的是根本不使用外部终端进行调试。

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

答案 1 :(得分:1)

正如亚瑟·曾尼格(Arthur Zennig)所说,要获取更多信息,您需要做些事情

  1. 首先,您需要创建终端配置文件

enter image description here

  1. 第二,打开启动配置,填写信息,例如下面的图像

enter image description here

祝你好运!

答案 2 :(得分:0)

如果您收到错误:

  

&#34;无法获得konsole tty / pty。检查konsole实际上是一个   终端,它接受这些论点&#34;

RUN&gt;配置LAUCHERS&gt; (见下图。我的项目名称为&#34;循环&#34;)
对我有用的是取消选中复选框&#34;使用外部终端&#34;。在&#34; Compiled Binaries&#34;中找到了标签。

RUN > Configure Laucher