如何在 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
在所有其他规则之后添加以下行:<youruser> ALL=(root) NOPASSWD:/usr/bin/gdb
在eclipse 中创建或修改调试配置以以 root 身份运行 gdb
例如在运行 > 调试配置 > C/C++ 应用程序 > YourProject 调试:
将 Debugger > Main > GDB 调试器从 gdb
更改为 sudo -u <youruser> 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 <youruser>
对我不起作用。【参考方案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 Configurations → Debugger → 端口号
编辑 Debug Configurations → Main → 在应用程序之前执行的命令
改为:
sudo gdbserver :<port number> <path to application>;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