使用strace可以看到ioctl调用某个文件描述符和某个命令。第三个参数是结构,但strace将其显示为指向内存的原始指针。 strace输出示例:
open("/dev/node", O_RDWR) = 3
ioctl(3, 0x108, 0x8f0eb18) = 0
close(3)
有没有办法(strace选项或其他工具)来查看结构是什么,或者至少是原始指针背后的值?
答案 0 :(得分:2)
在gdb中,如果在调用ioctl之前停止它,则可以输入:
(gdb) p *(ioctl_struct *) 0x8f0eb18
这将向您展示该内存位置的内容如何映射到ioctl_struct。
答案 1 :(得分:2)
我遇到了类似的问题:想要检查由ioctl
创建的vde_switch
的系统调用(创建TUN / TAP虚拟网络接口),以便知道我在做什么我的代码中的错误(必须与vde_switch
执行相同的操作,但是以编程方式执行。)
通过运行:
sudo strace vde_switch -tap tap0
作为Terry Greentail,我能够知道正在进行的系统调用是ioctl(5, TUNSETIFF, 0x7fffa99404e0)
,而指针是对struct ifreq
类型结构的引用。在我的代码中,我有类似ioctl(tapfd, TUNSETIFF, &ifr_dev)
的内容。
最初我试图让gdb在系统调用上停止,设置:catch syscall ioctl
(我已经将gdb作为gdb --args vde_switch -tap tap0
运行),但是只要捕获了catch,gdb就没有显示{的参数信息{1}}。经过一段时间的努力,我决定在gdb中运行strace,如:
ioctl
虽然没有断点以这种方式工作,但输出显示正在使用哪个文件描述符:
gdb --args strace vde_witch -tap -tap0
所以我尝试了另一次:open("/dev/net/tun", O_RDWR) = 9
ioctl(9, TUNSETIFF, 0x7fffffffe350) = 0
并设置条件断点:
gdb --args strace vde_witch -tap -tap0
调用约定(我在AMD64上)使用b ioctl if $rdi==9
作为第一个参数,RDI
表示第二个参数,RSI
表示第三个参数(请参阅System V AMD64 ABI。 )最后,当断点被击中时,我能够检查RDX
结构:
ifreq