8

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

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

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

欢迎任何想法。

(如果您需要更多信息,请随时询问)

4

3 回答 3

23

我也遇到了这个问题,但是我在 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 不是会话领导者是合理的。很公平,毕竟它是由 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 以使其正常工作(或者找到实际上导致它停止工作的原因......),所以我目前最好的建议就是不要使用用于调试目的的外部终端。

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

于 2011-09-16T01:11:47.967 回答
1

正如 Arthur Zennig 所说,要了解更多信息,您需要做一些事情

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

在此处输入图像描述

  1. 其次,打开启动配置,填写信息如下图

在此处输入图像描述

祝你好运!

于 2018-07-28T08:34:41.543 回答
0

如果您遇到错误:

“无法接收 konsole tty/pty。检查 konsole 实际上是一个终端并且它接受这些参数”

RUN > CONFIGURE LAUCHERS >(见下图。我的项目名称是“loops”)
对我有用的是取消选中“Use External Terminal”复选框。在“编译的二进制文件”选项卡中找到。

运行 > 配置 Laucher

于 2017-10-22T18:34:43.863 回答