前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >strace命令不可信任的一种情况

strace命令不可信任的一种情况

作者头像
河边一枝柳
发布2021-08-06 12:12:32
3600
发布2021-08-06 12:12:32
举报
文章被收录于专栏:一个程序员的修炼之路

Linux中,在客户环境中诊断问题的一个非常有用的命令就是strace,可以利用其查看程序执行过程中的系统调用,调用库,每一个系统调用的时间,以及接收到的信号等等,在这里就不详细阐述strace的功能了。

最近刚好遇到一个棘手的问题,在一个客户的环境中,应用程序调用系统调用ioctl与产品的内核模块交互总是失败。然后通过strace查看进程的执行过程中的ioctl系统调用是否有异常。查看到如下信息:

+++++++++++++++++++++++++++++

ioctl(3, CDROMREADTOCHDR, 0xffd92af0) = -1 EINVAL (Invalid argument) <0.000025>

+++++++++++++++++++++++++++++

ioctl第二个参数为与驱动交互的命令,是一个数值。奇怪的问题刚好就产生在这里,产品应用程序中的调用的ioctl的第二个参数为"SIOCXXXXXXX" ("SIOCXXXXXXX" 为产品内核模块实现的一个命令)。再查看"SIOCXXXXXXX"的值为0x40105305,而"CDROMREADTOCHDR"的值为0x5305,虽然低2位字节相同,可他们的数值毕竟不同啊。难道是ioctl会去截断高位2个字节?通过实验,在产品内核模块中收到的命令也为"SIOCXXXXXXX" (即0x40105305)。

经过诸多尝试,最后一个猜想,莫非strace打印出来的"CDROMREADTOCHDR"有误?仔细通过man查看了strace的解释,找到了一个参数描述:

+++++++++++++++++++++++++++++

-e raw=set

Print raw, undecoded arguments for the specified set of system calls. This option has the effect of causing all arguments to be printed in hexadecimal.This is mostly useful if you don’t trust the decoding or you need to know the actual numeric value of an argument.

+++++++++++++++++++++++++++++

简单来说,就是strace会根据系统调用参数的值进行decode,即转换为一些我们常见的宏名字,便于阅读。通过上面的最后一句,也可以看出,strace的decode也不一定是完全正确的。比如我不相信其对ioctl的decode结果,可以使用参数"-e raw=ioctl"去显示ioctl系统调用时参数的具体数值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个程序员的修炼之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档