我正在使用libpcap编程应用程序。当我在正常模式下调试应用程序时,pcap无法获取网络设备。似乎我必须在root中调试应用程序。 如何在root中调试应用程序?我有root密码。 我认为eclipse有这样的选项,可以为调试应用程序添加root,但我不知道该怎么做。 请帮忙。
答案 0 :(得分:62)
sudo visudo
<youruser> ALL=(root) NOPASSWD:/usr/bin/gdb
gdb
到sudo -u <youruser> gdb
更新(和警告!):
在他的评论中,nategoose指出这个答案应该带有警告:
让我的答案中建议的用户sudo
使用gdb
实际上为他/她提供管理员权限,这在许多情况下可能是不受欢迎的副作用。因此,我认为答案适用于不假设用户会试图损害系统的环境(例如,它是您自己的个人计算机或虚拟机)
对于多(不可信)用户环境,我认为使用unix' file capabilities启用gdb
调试应用程序而不需要管理员权限可能是更好的理想
答案 1 :(得分:3)
使用sudo启动Eclipse(仅用于完整性:http://www.eclipse.org/forums/index.php?t=msg&goto=516838&)
更新:关注xmoex解决方案。如果你以root身份运行Eclipse(即使用sudo),你的文件将是root拥有的......你可能不想要它。
答案 2 :(得分:3)
您可以在localhost上使用gdbserver来附加现有进程,以下是命令行:
sudo gdbserver :<listening port> --attach <pid>
或者您可以使用gdbserver创建一个新进程:
sudo gdbserver :<listening port> <process executable>
然后,您可以在Eclipse中,在调试器选项卡,调试器项目中选择gdbserver创建调试配置,并在下面的连接选项卡中输入侦听端口。
答案 3 :(得分:1)
另一种解决方案是授予您(或gdb可执行文件)作为mentioned here进行一些pcap捕获的权限。有这样的事情:
setcap cap_net_raw,cap_net_admin=eip /usr/bin/gdb
您应该能够允许将数据包捕获到gdb而不是root。
答案 4 :(得分:1)
这是我的操作方式:
创建 C / C ++远程应用程序
更改为:
sudo gdbserver :<port number> <path to application>;exit #
这将基本上运行通常由eclipse在 sudo 内部执行的 gdbserver ,后缀“ #”将保持eclipse命令执行。
答案 5 :(得分:0)
很久以前就问了这个问题,但如果这对任何人都有帮助,我会在bugzilla中打开一个bug,这个短线程解决了这个问题: bugzilla bug
答案 6 :(得分:-1)
最简单的方法,尝试sudo ./eclipse,然后像往常一样调试
答案 7 :(得分:-2)
从包含可执行文件的目录中的控制台:
sudo gdb ./my_program
如果eclipse支持远程调试,那么即使它在本地运行,你也可以这样做。
从控制台:
sudo gdbserver localhost:<port_number> ./my_program
然后告诉Eclipse地址(localhost和你选择的端口号)。
哦,是的,你说你这样做的原因是因为你使用的是libpcap
,所以你可能不想在TCP上使用远程调试,因为你可能最终捕获你的调试连接数据包了其他网络流量。
在这种情况下,您可以通过串行端口进行远程(但实际上是本地)调试。我从未在本地计算机上执行此操作,但您可以使用两个实际的串行端口(通过空调制解调器连接它们)或尝试使用psudoterminal:
sudo gdbserver /dev/ptmx ./my_program
这将在/dev/pts/
下创建psudo-terminal,但您必须弄清楚它的名称,并且它也可能使用限制性权限创建它。你可以绕过那些。除非您以root用户身份运行许多终端窗口,否则/dev/pts
下的许多条目不太可能属于root用户,因此请注意运行上述命令后执行的条目,然后{{1} }或sudo chmod
它使普通用户可以使用它,然后告诉调试器将其用作远程调试目标的串行连接。