【发布时间】:2011-05-20 09:56:39
【问题描述】:
我正在调试一个使用libnetfilter_queue 的程序。该文档指出用户空间队列处理应用程序需要CAP_NET_ADMIN 功能才能运行。我已使用setcap 实用程序完成此操作,如下所示:
$ sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
我已验证这些功能已正确应用,因为 a) 程序正常运行 b) getcap 返回以下输出:
$ getcap ./a.out
./a.out = cap_net_admin,cap_net_raw+eip
但是,当我尝试从命令行使用gdb(例如$ gdb ./a.out)调试该程序时,由于没有设置正确的权限而失败。 gdb 的调试功能可以正常工作并正常调试。
我什至尝试将这些功能应用于gdb 二进制文件本身,但无济于事。我这样做了(正如manpages 所记录的那样,“i”标志可能允许被调试者从调试器继承该功能。
我是否遗漏了一些琐碎的事情,或者这真的不能完成吗?
【问题讨论】:
-
GDB 使用 ptrace 子系统。它是否具有 CAP_SYS_PTRACE 功能?它是否适用于任何其他二进制文件?例如。 hello world 程序?
-
@thkala:我将问题编辑得更准确。
gdb工作正常,否则它可以调试任何程序(包括这个)。 -
您介意提及确切的错误消息吗?
-
本身没有错误信息。我使用的是开发者提供的this示例代码,
nfq_unbind_pf()返回-1(并且errno设置为1),表示失败。
标签: linux network-programming gdb sniffing linux-capabilities