我正在使用 libpcap 编写应用程序。当我在正常模式下调试应用程序时,pcap 无法获取网络设备。看来我必须在 root 中调试应用程序。如何在 root 中调试应用程序?我有root密码。我认为eclipse有这样一个选项可以为调试应用程序添加root,但我不知道该怎么做。请帮忙。
8 回答
- 使您的用户能够以 root 身份运行gdb而无需输入任何密码:
sudo visudo
在所有其他规则之后添加以下行:
<youruser> ALL=(root) NOPASSWD:/usr/bin/gdb
- 在Eclipse中创建或修改调试配置以以 root 身份运行 gdb,
例如在 Run > Debug Configurations > C/C++ Application > YourProject Debug:
将 Debugger > Main > GDB debugger 从gdb
更改为sudo -u <youruser> gdb
更新(和警告!):
nategoose 在他的评论中指出,这个答案应该带有警告:
使用户能够使用我的答案中建议sudo
的类似功能实际上会赋予他/她管理员权限,这在许多情况下可能是不希望的副作用。因此,我认为该答案适用于不假定用户会尝试破坏系统的环境(例如,它是您自己的个人计算机或虚拟机)gdb
对于多(不可信)用户环境,我认为利用unix 的文件功能来gdb
调试应用程序而不需要管理员权限可能是一个更好的主意
您可以在 localhost 上使用 gdbserver 来附加现有进程,以下是命令行:
sudo gdbserver :<listening port> --attach <pid>
或者您可以使用 gdbserver 创建一个新进程:
sudo gdbserver :<listening port> <process executable>
然后可以在Eclipse中创建一个调试配置,在debugger选项卡中,debugger项,选择gdbserver,在下面的connection选项卡中输入监听端口。
使用 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
您应该能够允许将数据包捕获到 gdb 而不是 root。
我是这样做的:
创建C/C++ 远程应用程序
- 在目标上,确保您的 sudo 不会提示输入密码
- 查看调试配置→调试器→端口号
- 编辑调试配置→主要→应用程序之前执行的命令
改成:
sudo gdbserver :<port number> <path to application>;exit #
这将基本上运行sudo中通常由 eclipse 执行的gdbserver ,尾随的“ # ”将阻止 eclipse 命令执行。
这个问题是很久以前提出的,但如果这对任何人都有帮助,我在 bugzilla 中打开了一个错误,这个短线程解决了这个问题: bugzilla bug
从带有可执行文件的目录中的控制台:
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 chmod
或sudo chown
它以使其可用于您的正常用户,然后告诉您的调试器将其用作与远程调试目标的串行连接。
最简单的方法,尝试 sudo ./eclipse,然后像往常一样调试