前段时间我将个人操作系统改为linux,将我的开发环境改为KDevelop。
然而,调试c ++项目仍然无法正常工作。 我的KDevelop版本是4.2.2(我通过包管理安装它)
每次点击“调试按钮”时,应用程序都会从控制台消息开始
warning: GDB: Failed to set controlling terminal: Operation not permitted
并且调试功能不可用。
欢迎任何想法。
(如果您需要其他信息,请不要犹豫)
答案 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)
答案 2 :(得分:0)