38

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

4

8 回答 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 在他的评论中指出,这个答案应该带有警告:

使用户能够使用我的答案中建议sudo的类似功能实际上会赋予他/她管理员权限,这在许多情况下可能是不希望的副作用。因此,我认为该答案适用于不假定用户会尝试破坏系统的环境(例如,它是您自己的个人计算机或虚拟机)gdb

对于多(不可信)用户环境,我认为利用unix 的文件功能gdb调试应用程序而不需要管理员权限可能是一个更好的主意

于 2011-11-15T21:16:15.663 回答
3

您可以在 localhost 上使用 gdbserver 来附加现有进程,以下是命令行:

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

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

sudo gdbserver :<listening port> <process executable>

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

于 2014-04-20T07:21:40.243 回答
3

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

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

于 2010-09-21T07:25:52.173 回答
1

另一种解决方案是授予您(或 gdb 可执行文件)进行某些 pcap 捕获的权利,如此处所述。像这样:

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

您应该能够允许将数据包捕获到 gdb 而不是 root。

于 2011-11-15T21:33:19.223 回答
1

我是这样做的:

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

  1. 在目标上,确保您的 sudo 不会提示输入密码
  2. 查看调试配置调试器端口号
  3. 编辑调试配置主要应用程序之前执行的命令

改成:

sudo gdbserver :<port number> <path to application>;exit #

这将基本上运行sudo中通常由 eclipse 执行的gdbserver ,尾随的“ # ”将阻止 eclipse 命令执行。

于 2020-02-05T17:25:30.430 回答
0

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

于 2014-03-19T07:05:39.460 回答
-2

从带有可执行文件的目录中的控制台:

sudo gdb ./my_program

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

从控制台:

sudo gdbserver localhost:<port_number> ./my_program

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

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

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

sudo gdbserver /dev/ptmx ./my_program

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

于 2010-05-23T22:24:25.880 回答
-2

最简单的方法,尝试 sudo ./eclipse,然后像往常一样调试

于 2017-04-24T06:02:08.693 回答