Eth*_*eal 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.
*/
Run Code Online (Sandbox Code Playgroud)
因为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".
Run Code Online (Sandbox Code Playgroud)
我检查了我的权限; 我的用户是tty组的一部分,所有相关文件都是可读写的.
浏览KDevelop源代码可以了解KDevelop如何实际设置终端.它运行shell脚本
tty > FIFO_PATH ; trap "" INT QUIT TSTP ; exec<&-; exec>&-; while :; do sleep 3600;done
Run Code Online (Sandbox Code Playgroud)
然后设置GDB以使用它从FIFO_PATH读取的终端设备.(顺便说一下,我的名字,而不是KDevelop使用的那个.)问题(我能说的最好)是gdb不是作为shell脚本的子代启动的,因此不能将它作为主要的tty使用.
我还没有意识到修补KDevelop以使其正常工作(或者找到实际上导致它首先停止工作的原因......),所以我现在建议的最好的就是不要使用用于调试目的的外部终端.
祝好运!如果我发现任何有用的东西,我会更新.
| 归档时间: |
|
| 查看次数: |
6900 次 |
| 最近记录: |