首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释strace输出

解释strace输出
EN

Stack Overflow用户
提问于 2012-06-21 17:27:21
回答 2查看 4.5K关注 1票数 11

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

代码语言:javascript
复制
open("/dev/node", O_RDWR) = 3
ioctl(3, 0x108, 0x8f0eb18) = 0
close(3)  

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

EN

回答 2

Stack Overflow用户

发布于 2012-06-22 05:17:22

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

代码语言:javascript
复制
(gdb) p *(ioctl_struct *) 0x8f0eb18

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-31 01:44:13

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

通过运行以下命令:

代码语言:javascript
复制
sudo strace vde_switch -tap tap0

作为Terry Greentail,我能够知道正在制作的syscall是ioctl(5, TUNSETIFF, 0x7fffa99404e0),并且指针将是对struct ifreq类型的结构的引用。在我的代码中,我有类似于ioctl(tapfd, TUNSETIFF, &ifr_dev)的东西。

最初,我试图让gdb在syscall上停止,设置为:catch syscall ioctl (我以gdb --args vde_switch -tap tap0身份运行gdb ),但每当命中捕获时,gdb都不会显示有关ioctl的参数的信息。在与此斗争了一段时间后,我决定在gdb中运行strace,如下所示:

代码语言:javascript
复制
gdb --args strace vde_witch -tap -tap0

尽管没有断点以这种方式工作,但输出显示了正在使用的文件描述符:

代码语言:javascript
复制
open("/dev/net/tun", O_RDWR)            = 9
ioctl(9, TUNSETIFF, 0x7fffffffe350)     = 0

所以我再次尝试使用:gdb --args strace vde_witch -tap -tap0并设置了一个条件断点:

代码语言:javascript
复制
b ioctl if $rdi==9

调用约定(我使用的是AMD64)使用RDI作为第一个参数,使用RSI作为第二个参数,使用RDX作为第三个参数(参见System V AMD64 ABI)。最后,当命中断点时,我能够检查ifreq结构:

代码语言:javascript
复制
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>}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11135254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档