我通过在本地机器上进行远程调试解决了这个问题。我使用root权限运行gdbserver,并从CLion连接到它。
要启动gdbserver,请使用sudo gdbserver:port myapp
命令,并使用端口
配置远程GDB调试。
sudo ./clion.sh
sudo -i
然后运行 clion.sh
,从来没有遇到过崩溃的问题。使用的是 Ubuntu 16.04 / 18.04。 - gerardw一行复制粘贴。将此命令粘贴到终端窗口中,运行您的进程,返回终端窗口并输入密码。
pkttyagent --process $(ps -o ppid= $(pgrep -f clion) | sort -n | tail -n1)
找到CLion的最顶层(所有打开项目的父级)进程ID(PID),其PPID为1。
$ ps -f $(pgrep -f clion)
UID PID PPID C STIME TTY STAT TIME CMD
thisisme 348892 1 7 Jun05 ? Sl 1041:34 /opt/clion...
pkttyagent
并将此进程作为其参数。$ pkttyagent --process 348892
pkexec
进程将会连接到在你的控制台上运行的tty代理,并提示你输入密码。在控制台窗口中输入你的密码,你的进程将继续以root身份在CLion中运行。
0 thisisme@iamhere:~/indir$ pkttyagent --process 348892
==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===
Authentication is needed to run `/opt/clion-2022.2.4/jbr/bin/java' as the super user
Authenticating as: thisisme,,, (thisisme)
Password:
==== AUTHENTICATION COMPLETE ===
在使用 Ubuntu 22.04 和 Mint 21 Vanessa 的过程中,找到了一些有趣的信息。
假设您不是 root 用户,在运行类似 systemctl restart polkit
这样的命令时,会提示您输入密码。在输入密码之前按下 ctrl-c,然后输入 systemctl status polkit
,您会看到一个 pkttyagent 进程被启动。
同样,在另一个终端中运行 pkexec ls
并查看状态输出时,您会发现 polkit.service 状态打印了可执行文件和参数,如 pkexec ls
。这就是提示我们应该启动另一个进程来代替直接调用 pkexec 的线索。看起来 CLion 在启动 pkexec
之前没有启动代理,所以我们需要自己为 CLion 连接代理。
阅读 pkttyagent 的手册页面,它接收一个监听权限提升请求的 PID。您只需启动一个代理,来自该 PID 的权限提升请求将显示在您的控制台上。
无论是使用 CMake 还是 Makefile 来构建项目都没有关系;设置步骤都是相同的。
您可以创建一个Bash脚本来帮助您。例如,run.sh
:
#!/usr/bin/env bash
echo $LOGIN_PASSWD | sudo -S yourExecutable --with=some-arguments
chmod a+x run.sh
命令,并在 Run/Debug Configurations 中将当前账户的密码导出为环境变量。