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

38

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


1
基本上,以 root 身份运行您的调试器。您是否尝试通过 IDE 使用调试器? - Artelius
你能告诉我如何以root身份运行调试器吗? 是的,我使用Eclipse IDE。 - futang
除非您也将IDE作为root运行,否则可能没有简单或直接的方法来以root身份运行调试器。 - nategoose
8个回答

68
  1. 使用户可以以root身份运行而无需输入任何密码:
    sudo visudo
    在所有其他规则之后添加以下行:
    <youruser> ALL=(root) NOPASSWD:/usr/bin/gdb
  2. 中创建或修改一个调试配置,以root身份运行gdb
    例如,在Run > Debug Configurations > C/C++ Application > YourProject Debug中:
    将Debugger > Main > GDB debugger从gdb更改为sudo -u <youruser> gdb

更新(和警告!):

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

启用用户对 gdb 使用 sudo,就像我在答案中建议的那样,实际上会将管理员权限授予他/她,这在许多情况下可能是一个不希望发生的副作用。因此,我认为该答案适用于不假定用户会尝试损坏系统的环境(例如你自己的个人计算机或虚拟机)。
对于多用户(非受信任)环境,我认为更好的方法是利用unix' file capabilities来启用gdb调试应用程序,而无需管理员权限。

2
非常棒的答案,提醒其他人我在做这个过程中遇到了一个小问题:我将LD_LIBRARY_PATH设置为我的用户,但是root没有它,所以我将它添加到我的sudo命令中,但是sudo不允许您设置LD_LIBRARY_PATH,因此我在visudo中添加了这个 'Defaults env_keep += "LD_LIBRARY_PATH"'。 - stu
我遇到了错误 Could not determine GDB version using command: sudo -u debug gdb --version。如何解决? - fralbo
我已经能够在KDevelop中以root身份调试udisksd,并使用答案中略微修改的两个步骤进行了调试:1.第一步很方便,但不是必需的,因为可以从终端启动KDevelop,并在触发调试操作时在提示符处输入root密码。2.在KDevelop的主菜单->运行->配置启动...->调试页面中,在Shell脚本字段中设置*/usr/local/bin/run-as-sudo*。必须创建此本地脚本并标记为可执行。其内容(2行):#!/usr/bin/env bash \n sudo "$@"。这个答案的sudo -u <youruser>对我没用。 - vedg

3
您可以在本地使用gdbserver附加到现有进程,以下是命令行: ```bash gdbserver localhost:port PID ``` 其中,port是您选择的端口号,PID是您要调试的进程的进程ID。
sudo gdbserver :<listening port> --attach <pid>

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

sudo gdbserver :<listening port> <process executable>

接下来,在Eclipse中可以创建一个调试配置,在调试器选项卡中选择gdbserver,并在下面的连接选项卡中输入监听端口。


3

1
这不是一个好主意,如此解释:https://dev59.com/BXE85IYBdhLWcg3w2Hbs#0J2cEYcBWogLw_1btIO8 - Paolo M
1
我同意你的观点,Paolo。xmoex的答案是更好的解决方案。 - David

1

另一种解决方案是授予您(或gdb可执行文件)制作某些pcap捕获的权限,如此处所述。类似于以下内容:

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

你应该能够允许在不使用 root 权限的情况下捕获 gdb 数据包。


当以超级用户身份运行时,这个程序可以正常工作。同时,通过授予gdbserver对pcap捕获的访问权限,也使远程调试更加容易。 - fredk

1

以下是我完成的方法:

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

  1. 确保在目标机器上,sudo不会提示输入密码
  2. 查看Debug ConfigurationsDebuggerPort number
  3. 编辑Debug ConfigurationsMainCommands to execute before application

更改为:

sudo gdbserver :<端口号> <应用程序路径>;exit #

这将在sudo内部运行通常由eclipse执行的gdbserver,结尾的'#'将阻止eclipse命令的执行。


0

这个问题很久以前就被问过了,但如果这对任何人有帮助,我在bugzilla上开了一个bug,并且这个简短的线程解决了这个问题: bugzilla bug


-2

从包含可执行文件的目录中的控制台:

sudo gdb ./my_program

如果Eclipse支持远程调试,即使它在本地运行,您也可以这样做。
从控制台:
sudo gdbserver localhost:<port_number> ./my_program

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

哦,是的,您说您这样做的原因是因为您正在使用libpcap,所以您可能不想使用TCP上的远程调试,因为您可能会捕获除了其他网络流量之外的调试连接数据包。

在这种情况下,您可以通过串行端口进行远程(但实际上是本地的)调试。我从未在本地机器上执行过此操作,但您可以使用两个实际的串行端口(通过空模拟线连接它们),或尝试使用伪终端:

sudo gdbserver /dev/ptmx ./my_program

这将在/dev/pts/下创建伪终端,但您需要找出它的名称,而且它可能会以限制权限创建。您可以绕过这些限制。除非您作为root运行了许多终端窗口,否则不太可能在/dev/pts下有许多属于root的条目,因此在运行上述命令后注意其中一个,并使用sudo chmodsudo chown使其对您的普通用户可用,然后告诉调试器将其用作与远程调试目标的串行连接。


-2

最简单的方法是尝试使用sudo ./eclipse,然后像往常一样进行调试。


请不要提供重复的答案。 - nomem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接