不久前,我将个人操作系统更改为 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 不是会话领导者是合理的。很公平,毕竟它是由 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 以使其正常工作(或者找到实际上导致它停止工作的原因......),所以我目前最好的建议就是不要使用用于调试目的的外部终端。
祝你好运!如果我发现任何有用的东西,我会更新。