我正在使用 libpcap 编写应用程序。当我以正常模式调试应用程序时,pcap 无法获取网络设备。看起来我必须在 root 权限下进行调试。 如何在 root 权限下调试应用程序?我有 root 密码。 我觉得 Eclipse 有一个选项可以为调试应用程序添加 root,但我不知道怎么做。 请帮忙。
我正在使用 libpcap 编写应用程序。当我以正常模式调试应用程序时,pcap 无法获取网络设备。看起来我必须在 root 权限下进行调试。 如何在 root 权限下调试应用程序?我有 root 密码。 我觉得 Eclipse 有一个选项可以为调试应用程序添加 root,但我不知道怎么做。 请帮忙。
sudo visudo
<youruser> ALL=(root) NOPASSWD:/usr/bin/gdb
gdb
更改为sudo -u <youruser> gdb
更新(和警告!):
在他的评论中,nategoose指出这个答案应该附带一个警告:
启用用户对gdb
使用 sudo
,就像我在答案中建议的那样,实际上会将管理员权限授予他/她,这在许多情况下可能是一个不希望发生的副作用。因此,我认为该答案适用于不假定用户会尝试损坏系统的环境(例如你自己的个人计算机或虚拟机)。gdb
调试应用程序,而无需管理员权限。Could not determine GDB version using command: sudo -u debug gdb --version
。如何解决? - fralbo#!/usr/bin/env bash \n sudo "$@"
。这个答案的sudo -u <youruser>
对我没用。 - vedgsudo gdbserver :<listening port> --attach <pid>
或者您可以使用gdbserver创建一个新的进程:
sudo gdbserver :<listening port> <process executable>
接下来,在Eclipse中可以创建一个调试配置,在调试器选项卡中选择gdbserver,并在下面的连接选项卡中输入监听端口。
为了完整起见,使用sudo启动Eclipse(仅供参考:http://www.eclipse.org/forums/index.php?t=msg&goto=516838&)
更新:请遵循xmoex的解决方案。如果您以root身份运行Eclipse(即使用sudo),则文件将属于root...这可能不是您想要的。
另一种解决方案是授予您(或gdb可执行文件)制作某些pcap捕获的权限,如此处所述。类似于以下内容:
setcap cap_net_raw,cap_net_admin=eip /usr/bin/gdb
你应该能够允许在不使用 root 权限的情况下捕获 gdb 数据包。
gdbserver
对pcap捕获的访问权限,也使远程调试更加容易。 - fredk以下是我完成的方法:
创建一个C/C++远程应用程序
更改为:
sudo gdbserver :<端口号> <应用程序路径>;exit #
这将在sudo内部运行通常由eclipse执行的gdbserver,结尾的'#'将阻止eclipse命令的执行。
从包含可执行文件的目录中的控制台:
sudo gdb ./my_program
sudo gdbserver localhost:<port_number> ./my_program
然后告诉Eclipse地址(localhost和您选择的端口号)。
哦,是的,您说您这样做的原因是因为您正在使用libpcap
,所以您可能不想使用TCP上的远程调试,因为您可能会捕获除了其他网络流量之外的调试连接数据包。
在这种情况下,您可以通过串行端口进行远程(但实际上是本地的)调试。我从未在本地机器上执行过此操作,但您可以使用两个实际的串行端口(通过空模拟线连接它们),或尝试使用伪终端:
sudo gdbserver /dev/ptmx ./my_program
这将在/dev/pts/
下创建伪终端,但您需要找出它的名称,而且它可能会以限制权限创建。您可以绕过这些限制。除非您作为root运行了许多终端窗口,否则不太可能在/dev/pts
下有许多属于root的条目,因此在运行上述命令后注意其中一个,并使用sudo chmod
或sudo chown
使其对您的普通用户可用,然后告诉调试器将其用作与远程调试目标的串行连接。
最简单的方法是尝试使用sudo ./eclipse,然后像往常一样进行调试。