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

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系统调用时参数的具体数值。

时间: 2025-01-12 03:18:44

strace命令不可信任的一种情况的相关文章

linux下mv命令移动目录的二种情况

mv 移动目录分为2种情况: 第一种:目标目录为空,使用mv命令可以直接移动,使用绝对路径执行或加参数-f 不会提示是否移动. [[email protected] ~]# mkdir 1 [[email protected] ~]# mkdir /tmp/1 [[email protected] ~]# mv 1/ /tmp/ mv: overwrite `/tmp/1'? n [[email protected]# /bin/mv 1/ /tmp/ 第二种:目标目录非空,使用绝对路径执行也会

使用 Linux 的 strace 命令跟踪/调试程序的常用选项

译文:LCTT  https://linux.cn/article-3935-1.html译者: guodongxiaren 在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用.当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行. 这个简单而又强大的工具几乎在所有的Linux操作系统上可用,并且可被用来调试大量的程序. 命令用法 让我们看看strace命令如何追踪一个程序的执行情况. 最简单的形式,strace后面可以跟任何命

strace命令详解

strace命令详解strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的参数并返回符号形式的值.strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核. 下面记录几个常用 option . 1 -f -F选项告诉strace同时跟踪fork和vfork出来的进程 2 -o xxx.txt 输出到某个文件. 3 -e execve 只记录 execve 这类系统调用 -------------------------------

https://www.jqhtml.com/30047.html strace + 命令: 这条命令十分强大,可以定位你程序到底是哪个地方出了问题

https://www.jqhtml.com/30047.html 我的Linux手册 服务器 浏览数:72 2019-1-30 原文链接 基础安装 # CentOS sudo yum install epel-release 命令行Tips 进程及端口 # 查看端口占用情况 netstat -ap | grep 端口号   # 查看某一个端口 netstat -ntlp top -p 进程ID:查看进程的实时情况,包括内存大小,内存占用率.CPU占用率,运行时间 cat /proc/进程ID/

[转帖]强大的strace命令用法详解

文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. strace底层使用内核的ptrace特性来实现其功能. 在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能.strace作为一种动态跟踪工具,能够帮助运维高效地定位进

linux跟踪线程的方法:LWP和strace命令

摘要:在使用多线程程序时,有时会遇到程序功能异常的情况,而这种异常情况并不是每次都发生,很难模拟出来.这时就需要运用在程序运行时跟踪线程的手段,而linux系统的LWP和strace命令正是这种技术手段.本文对LWP和strace命令做了简明扼要的介绍,并通过一个实例来说明如何运用.总而言之,LWP和strace的使用可以提高多线程程序的可维护性. 问题描述: 我们来看一个问题:程序tcp_client同时创建多个线程向同一个服务器发送数据,每个线程发送不同类型的数据,服务器接收数据后,可以通过

Tomcat内存溢出的三种情况及解决办法分析

转自 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380147d8c8c4668d4e419ce3b4c413037bfa6663f405a8e906b6075aa1f0ce9f03176370123b5989b8908dcac925f75ce786a6459db0144dc4ee59a1167877bcd06feaf68bce6e732e2e88893880705dd53742bddaccd095b4

SSO单点登录三种情况的实现方式详解

单点登录(SSO——Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子系统——百度经验.百度知道.百度文库等等,如果我们使用这些系统的时候,每一个系统都需要我们输入用户名和密码登录一次的话,我相信用户体验肯定会直线下降.当然,对于个人博客这类系统来说根本就用不上单点登录了. 假如,我们的系统很庞大,但是就是这一个系统,并没有什么子系统.这时我们也不需要单点登录.我们需要的是搭建集群环境,这里虽说只有一个系

转:sqlplus与shell互相传值的几种情况

sqlplus与shell互相传值的几种情况 情况一:在shell中最简单的调用sqlplus $cat test.sh #!/bin/sh sqlplus oracle/[email protected]>file.log <<EOF select * from test; exit EOF  #注意EOF要顶格写 $sh test.sh $cat file.log --省略若干系统提示信息------- SQL> EMPNO   EMPNAME          SAL