11

使用 strace 可以查看特定文件描述符和特定命令的 ioctl 调用。第三个参数是一个结构,但 strace 将其显示为指向内存的原始指针。strace 输出示例:

open("/dev/node", O_RDWR) = 3
ioctl(3, 0x108, 0x8f0eb18) = 0
close(3)  

有没有办法(strace 选项或其他工具)来查看结构是什么,或者至少是原始指针后面的值?

4

2 回答 2

2

在 gdb 中,如果在调用 ioctl 之前将其停止,则可以输入:

(gdb) p *(ioctl_struct *) 0x8f0eb18

这将向您展示该内存位置的内容如何映射到 ioctl_struct。

于 2012-06-21T21:17:22.163 回答
2

我遇到了一个类似的问题:想要检查一个系统调用ioctlvde_switch它创建一个 TUN/TAP 虚拟网络接口),以便知道我在我的代码中做错了什么(它必须做同样的事情vde_switch,但以编程方式。)

通过运行:

sudo strace vde_switch -tap tap0

作为 Terry Greentail,我能够知道正在进行的系统调用是ioctl(5, TUNSETIFF, 0x7fffa99404e0)并且指针将是对 type 结构的引用struct ifreq。在我的代码中,我有类似ioctl(tapfd, TUNSETIFF, &ifr_dev).

最初我试图让 gdb 在系统调用上停止,设置:(catch syscall ioctl我已经运行 gdb as gdb --args vde_switch -tap tap0),但每当遇到问题时,gdb 都没有显示有关ioctl. 在为此苦苦挣扎了一段时间后,我决定在 gdb 中运行 strace,如下所示:

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并设置了一个条件断点:

b ioctl if $rdi==9

调用约定(我在 AMD64 上)RDI用于第一个参数、RSI第二个和RDX第三个参数(参见System V AMD64 ABI。)最后,当断点被命中时,我能够检查ifreq结构:

Breakpoint 6, ioctl () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: File or directory not found.

(gdb) p (struct ifreq) *$rdx
$5 = {ifr_ifrn = {ifrn_name = "tap0", '\000' <repete 11 vezes>}, ifr_ifru = {ifru_addr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_dstaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_broadaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_netmask = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_hwaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_flags = 4098, ifru_ivalue = 4098, ifru_mtu = 4098, ifru_map = {mem_start = 4098, mem_end = 0, base_addr = 0, irq = 0 '\000', dma = 0 '\000', port = 0 '\000'}, ifru_slave = "\002\020", '\000' <repete 13 vezes>, ifru_newname = "\002\020", '\000' <repete 13 vezes>, ifru_data = 0x1002 <Address 0x1002 out of bounds>}}
于 2013-07-30T17:44:13.203 回答