使用Qt Creator在Ubuntu上以root权限调试Qt应用程序

可以使用sudo来以root权限运行我的应用程序,像这样:
sudo ./MyApp

可以使用QtCreator以root权限调试我的Qt应用程序吗?在Ubuntu系统上如何做到这一点?
6个回答

  1. 前往工具 -> 选项 -> 环境
  2. 选项卡 常规下的系统组中有一个终端选项
  3. 默认值设置为/usr/bin/xterm -e。将其替换为/usr/bin/xterm -e sudo/usr/bin/gnome-terminal -x sudo
  4. 点击应用确定按钮。
  5. 模式选择器下,点击项目,选择运行选项。在运行分组框下选择在终端中运行

请记住:sudo选项必须存在

编辑/etc/sudoers使用sudo visudo

下次运行程序时,它将在一个新的 xterm 或 gnome-terminal 中以超级用户权限被调用,并且会要求输入root密码

2这是正确的解决方案。 - Ray
2我们应该在/etc/sudoers文件中添加什么内容? - Necktwi
4对我来说不起作用,在输入sudo密码后,应用程序输出报告“调试已完成”,但没有一个断点真正中断。 - user636443
就记录而言,“模式选择器”是最左边的按钮面板,顶部有“欢迎”字样。 - Eric

我通过以root身份启动Qt Creator来解决了这个问题。
sudo /usr/bin/qtcreator

现在,当我编译和调试时,它将获取应用程序的根权限。现在可以使用根权限调试我的应用程序。

3那是一件非常非常非常愚蠢的事情。我并不是要冒犯你。所谓的“愚蠢”是指这不是明智之举。我相信大多数人绝对不会做这样的事情。 - iharob
https://gist.github.com/ppetraki/a0080da047047ea184c6 - ppetraki
1不要成为Windows用户。不要以root身份运行所有东西。 - Shahbaz
1不要这样做!这样会改变保存在这种条件下的源文件的所有权,并且还会改变你的.pro.user和其他Qt Creator配置文件的所有权。当你切换回以常规用户身份运行时,你将遇到错误,并且需要费一些周章才能恢复一切。我是通过吃亏学到了这个教训... - BuvinJ

我会在终端上使用GDB服务器(作为root用户)运行程序,然后通过QtCreator连接到服务器上的gdb。你可以像这样启动gdbserver:
$ sudo gdbserver host:2345 ./MyApp

在这里,您正在使用端口2345托管服务器。您还可以检查您的应用程序是否确实以UID 0运行。
$ sudo ps -u

现在,在Qt Creator中,选择调试 -> 开始调试 -> 附加到正在运行的调试服务器。填写表单... 最重要的是端口和服务器地址。我选择了127.0.0.1和2345。您可以选择在主函数处中断以在程序开始时中断。GDB服务器直到连接后才启动程序。

在Qt支持论坛上推荐了以下操作:
在Qt Creator中,通过“选项”->“设备”添加远程Linux设备。将其地址设置为localhost,用户设置为root。创建一对认证密钥,并将公钥粘贴到/root/.ssh/authorized_keys中。 然后在“选项”->“工具链”中克隆桌面套件,并将新套件的设备设置为您在前一步中创建的设备。
现在,当您开始调试时,Qt Creator应该会自动通过ssh连接到localhost作为root用户,启动gdbserver并进行调试。
这也适用于无调试运行。
也许您还应该在远程主机上设置程序的安装,但这是另外一个故事,并且对于Qmake和QBS来说有不同的方法。

https://forum.qt.io/post/185983


运行root是一个可怕的主意。相反,使用源代码,并让qtcreator使用sudo来启动gdb,像这样。需要在tty上运行qtcreator并在启动qtcreator之前进行sudo授权,或者配置您的用户为无需密码的sudo(不推荐)。我稍后会编写一个更完整的解决方案。
我花了1-2个小时的时间进行编码/调试,没有任何关于QT的先前知识。大部分时间都花在等待编译完成上。

https://gist.github.com/ppetraki/a0080da047047ea184c6

--- qtcreator-3.0.1.orig/src/plugins/debugger/gdb/gdbprocess.cpp +++ qtcreator-3.0.1/src/plugins/debugger/gdb/gdbprocess.cpp @@ -59,7 +59,11 @@ QByteArray GdbProcess::readAllStandardEr

void GdbProcess::start(const QString &cmd, const QStringList &args) { - m_gdbProc.setCommand(cmd, Utils::QtcProcess::joinArgs(args)); + QStringList sudoArgs; + sudoArgs << cmd << args; + QString sudoCmd = QString::fromUtf8("/usr/bin/sudo"); + + m_gdbProc.setCommand(sudoCmd, Utils::QtcProcess::joinArgs(sudoArgs)); m_gdbProc.start(); }


一种简单的方法是在终端中运行项目,检查“以Root用户身份运行”。
以下是截图显示的步骤:

enter image description here