如何在 Ubuntu 的 Eclipse 中以 root 身份调试应用程序?

Posted

技术标签:

【中文标题】如何在 Ubuntu 的 Eclipse 中以 root 身份调试应用程序?【英文标题】:how to debug application as root in eclipse in Ubuntu? 【发布时间】:2011-02-22 21:32:03 【问题描述】:

我正在使用 libpcap 编写应用程序。当我在正常模式下调试应用程序时,pcap 无法获取网络设备。看来我必须在 root 中调试应用程序。 如何在 root 中调试应用程序?我有root密码。 我认为eclipse有这样一个选项可以为调试应用程序添加root,但我不知道该怎么做。 请帮忙。

【问题讨论】:

基本上,以 root 身份运行调试器。您是否尝试通过 IDE 使用调试器? 你能告诉我如何以 root 身份运行调试器吗?是的,我使用 Eclipse IDE。 除非您还以 root 身份运行 IDE,否则可能没有简单或直接的方式以 root 身份运行调试器。 【参考方案1】:

从您的可执行文件所在目录中的控制台:

sudo gdb ./my_program

如果 eclipse 支持远程调试,那么即使它在本地运行,您也可以这样做。

从控制台:

sudo gdbserver localhost:<port_number> ./my_program

然后告诉 Eclipse 地址(本地主机和您选择的端口号)。

哦,是的,你说你这样做的原因是因为你使用libpcap,所以你可能不想通过 TCP 使用远程调试,因为除了你的其他网络之外,你最终可能会捕获调试连接数据包交通。

在这种情况下,您可以通过串行端口进行远程(但实际上是本地)调试。我从来没有在本地机器上这样做过,但你可以使用两个实际的串行端口(通过空调制解调器连接它们)或尝试使用伪终端:

sudo gdbserver /dev/ptmx ./my_program

这将在/dev/pts/ 下创建伪终端,但您必须弄清楚它的名称,并且它也可能使用限制性权限创建它。你可以绕过这些。除非您以 root 身份运行大量终端窗口,否则您不太可能在 /dev/pts 下有很多属于 root 的条目,因此请注意在运行上述命令之后执行的那个,然后是 sudo chmod 或 @987654328 @it 使其可供普通用户使用,然后告诉调试器将其用作与远程调试目标的串行连接。

【讨论】:

【参考方案2】:

使用 sudo 启动 Eclipse(为了完整性:http://www.eclipse.org/forums/index.php?t=msg&goto=516838&)

更新:关注 xmoex 解决方案。如果您以 root 身份运行 Eclipse(即使用 sudo),您的文件将是 root 拥有的……这可能是您不想要的。

【讨论】:

这不是一个好主意,如下所述:***.com/questions/2580279/… 我同意你的观点 Paolo,xmoex 的答案是一个更好的解决方案。【参考方案3】:
    使您的用户能够以 root 身份运行 gdb 而无需任何请求 密码:sudo visudo 在所有其他规则之后添加以下行:&lt;youruser&gt; ALL=(root) NOPASSWD:/usr/bin/gdb 在eclipse 中创建或修改调试配置以以 root 身份运行 gdb 例如在运行 > 调试配置 > C/C++ 应用程序 > YourProject 调试: 将 Debugger > Main > GDB 调试器从 gdb 更改为 sudo -u &lt;youruser&gt; gdb

更新(和警告!):

在他的评论中,nategoose 指出这个答案应该带有警告:

允许用户使用sudo 代替gdb,就像我的回答中所建议的那样实际上为他/她提供了管理员权限,这在许多情况下可能是一个不受欢迎的副作用。因此,我认为该答案适用于不假定用户会尝试破坏系统的环境(例如,它是您自己的个人计算机或虚拟机)

对于多(不可信)用户环境,我认为使用unix' file capabilities 启用gdb 来调试应用程序而不需要管理员权限可能会更好

【讨论】:

出色的答案,请注意我遇到的一个小问题:我将 LD_LIBRARY_PATH 设置为我的用户,但 root 没有它,所以我将它添加到我的 sudo 命令但 sudo 没有允许您设置 LD_LIBRARY_PATH 所以我在 visudo 'Defaults env_keep += "LD_LIBRARY_PATH"' 中添加了这个 我收到错误Could not determine GDB version using command: sudo -u debug gdb --version如何解决? 我已经能够在 KDevelop 中以 root 身份调试 udisksd,只需对答案中的 2 个步骤稍作修改: 1. 第一步很方便,但不是必需的,因为 KDevelop 可以从终端启动,并且可以在触发 Debug 操作时在提示符处输入 root 密码。 2.在KDevelop的主菜单->Run->Configure Launches...->Debug页面设置/usr/local/bin/run-as-sudo中的Shell script 场。必须创建此本地脚本并将其标记为可执行文件。其内容(2 行):#!/usr/bin/env bash \n sudo "$@"。这个答案的sudo -u &lt;youruser&gt; 对我不起作用。【参考方案4】:

另一个解决方案是授予您(或 gdb 可执行文件)以mentioned here 进行某些 pcap 捕获的权利。像这样:

setcap cap_net_raw,cap_net_admin=eip /usr/bin/gdb

您应该能够允许在没有 root 权限的情况下将数据包捕获到 gdb。

【讨论】:

这在以超级用户身份运行时有效。通过将 pcap 捕获的访问权限授予gdbserver,还使远程调试更容易【参考方案5】:

很久以前有人问过这个问题,但如果这对任何人都有帮助,我在 bugzilla 中打开了一个错误,这个短线程解决了这个问题: bugzilla bug

【讨论】:

【参考方案6】:

你可以在localhost上使用gdbserver来附加一个已有的进程,下面是命令行:

sudo gdbserver :<listening port> --attach <pid>

或者您可以使用 gdbserver 创建一个新进程:

sudo gdbserver :<listening port> <process executable>

然后就可以在Eclipse中创建调试配置了,在debugger选项卡,debugger项,选择gdbserver,在下面的connection选项卡中输入监听端口。

【讨论】:

【参考方案7】:

最简单的方法,试试sudo ./eclipse,然后照常调试

【讨论】:

请不要提供重复的答案。【参考方案8】:

我是这样做的:

创建一个C/C++ 远程应用程序

    在目标上,确保您的 sudo 不会提示输入密码 查看Debug ConfigurationsDebugger端口号 编辑 Debug ConfigurationsMain在应用程序之前执行的命令

改为:

sudo gdbserver :&lt;port number&gt; &lt;path to application&gt;;exit #

这将基本上运行 gdbserver,通常由 eclipse 在 sudo 中执行,尾随的 '#' 将保留 eclipse正在执行的命令。

【讨论】:

以上是关于如何在 Ubuntu 的 Eclipse 中以 root 身份调试应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu16.04 install eclipse-jee-oxygen-R-linux-gtk-x86_64

Ubuntu16.04 eclipse-jee-oxygen-R-linux-gtk-x86_64 Maven

如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?

Ubuntu16.04 install eclipse-jee-oxygen-R-linux-gtk-x86_64.tar.gz

如何在 r 中以某个缩放级别显示标记?

如何在 ubuntu 14.04 上运行的 ruby​​ 中以编程方式解压缩 .tar.xz 文件(没有中间体)?