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

9

一段时间以前,我将个人操作系统改为了Linux,并将开发环境改为了KDevelop。

然而,C++项目的调试仍未像应该的那样正常工作。我的KDevelop版本是4.2.2(我通过软件包管理安装它)。

每次我点击"调试按钮"时,应用程序都会以控制台消息开始运行,信息为warning: GDB: Failed to set controlling terminal: Operation not permitted,导致调试功能不可用。

欢迎任何想法。

(如果您需要更多信息,请不要犹豫问我)


只是一个小问题,实际上在谷歌上搜索该警告会得到6k个结果。 - Alok Save
我在谷歌上搜索了那个警告,但是我无法解决它 - 这就是为什么我写了这篇文章。 - Mythli
gdb 从命令行工作是否符合预期? - Keith Layne
我记得曾经试过,它抱怨我没有Gameboy Advance :) 或者类似的东西。 - stijn
这个错误也会在Code::Blocks和Netbeans中发生。 - roman
显示剩余2条评论
3个回答

24

我也遇到了这个问题,但是我在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.
 */

由于GDB创建的tty实际上是另一个进程的控制tty(这似乎非常不可能),因此它失败并出现EPERM错误的唯一其他原因是,我认为合理的假设是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。

目前我感觉没精力去修补KDevelop使其正常工作(或找出导致它停止工作的原因),所以我能提供的最佳建议就是在调试时简单地不使用外部终端。

祝你好运!如果我发现任何有用的信息,我会进行更新。


2
你只收到54分的回复?!伙计,这得直接发到我的Twitter上!多么好的反馈啊! - user491135
不幸的是,对于调试ncurses应用程序的人来说,不使用外部终端不是一个选项。 - Daniel

1

正如Arthur Zennig所说,要获取更多信息,你需要采取行动。

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

enter image description here

其次,打开启动配置项(Launch Configurations),填写以下图像中所示的信息。

enter image description here

祝你好运!


0

如果你遇到了以下错误:

"Can't receive konsole tty/pty. Check that konsole is actually a terminal and that it accepts these arguments"

RUN > CONFIGURE LAUCHERS >(见下图,我的项目名称是“loops”)
对我有用的方法是取消“使用外部终端”复选框。在“已编译的二进制文件”选项卡中找到。

RUN > Configure Laucher


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接