linux strace 命令
有时小问题可以通过观察用户空间的应用程序的行为来追踪. 监视程序也有助于建立对驱 动正确工作的信心. 例如, 我们能够对 scull 感到有信心, 在看了它的读实现如何响应 不同数量数据的读请求之后.
73
有几个方法来监视用户空间程序运行. 你可以运行一个调试器来单步过它的函数, 增加打 印语句, 或者在
strace 下运行程序. 这里, 我们将讨论最后一个技术, 当真正目的是检 查内核代码时它是最有趣的.
strace 命令时一个有力工具, 显示所有的用户空间程序发出的系统调用. 它不仅显示调
用, 还以符号形式显示调用的参数和返回值. 当一个系统调用失败, 错误的符号值(例如, ENOMEM)和对应的字串(Out of memory) 都显示. strace 有很多命令行选项; 其中最有用 的是 -t 来显示每个调用执行的时间, -T 来显示调用中花费的时间, -e 来限制被跟踪调 用的类型, 以及-o 来重定向输出到一个文件. 缺省地, strace 打印调用信息到 stderr.
strace 从内核自身获取信息. 这意味着可以跟踪一个程序, 不管它是否带有调试支持编 译(对
gcc 是 -g 选项)以及不管它是否 strip 过. 你也可以连接追踪到一个运行中的进 程, 类似于一个调试器的方式连接到一个运行中的进程并控制它.
跟踪信息常用来支持发给应用程序开发者的故障报告, 但是对内核程序员也是很有价值的. 我们已经看到驱动代码运行如何响应系统调用; strace 允许我们检查每个调用的输入和
输出数据的一致性.
例如, 下面的屏幕输出显示(大部分)运行命令 strace ls /dev > /dev/scull0
的最后的 行:
open("/dev",
O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=24576,
...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 141 entries */,
4096) = 4088 [...]
getdents64(3, /* 0 entries */,
4096) = 0
close(3) = 0 [...]
fstat64(1, {st_mode=S_IFCHR|0664,
st_rdev=makedev(254, 0), ...}) = 0 write(1,
"MAKEDEV\nadmmidi0\nadmmidi1\nadmmid"..., 4096) = 4000
write(1,
"b\nptywc\nptywd\nptywe\nptywf\nptyx0\n"..., 96) = 96
write(1, "b\nptyxc\nptyxd\nptyxe\nptyxf\nptyy0\n"...,
4096) = 3904
write(1,
"s17\nvcs18\nvcs19\nvcs2\nvcs20\nvcs21"..., 192) = 192
write(1,
"\nvcs47\nvcs48\nvcs49\nvcs5\nvcs50\nvc"..., 673) = 673
close(1) = 0
exit_group(0) = ?
从第一个 write 调用看, 明显地, 在 ls 结束查看目标目录后, 它试图写
4KB. 奇怪地 (对 ls), 只有 4000 字节写入, 并且操作被重复.
但是, 我们知道 scull 中的写实现一 次写一个单个量子, 因此我们本来就期望部分写. 几步之后,
所有东西清空, 程序成功退 出.
作为另一个例子, 让我们读取 scull 设备(使用 wc 命令):
74
[...]
open("/dev/scull0", O_RDONLY|O_LARGEFILE) =
3
fstat64(3, {st_mode=S_IFCHR|0664,
st_rdev=makedev(254, 0), ...}) = 0 read(3,
"MAKEDEV\nadmmidi0\nadmmidi1\nadmmid"..., 16384) = 4000
read(3, "b\nptywc\nptywd\nptywe\nptywf\nptyx0\n"...,
16384) = 4000
read(3,
"s17\nvcs18\nvcs19\nvcs2\nvcs20\nvcs21"..., 16384) = 865
read(3, "", 16384) = 0
fstat64(1, {st_mode=S_IFCHR|0620,
st_rdev=makedev(136, 1), ...}) = 0 write(1, "8865 /dev/scull0\n", 17)
= 17
close(3) = 0
exit_group(0) = ?
如同期望的, read 一次只能获取 4000 字节, 但是数据总量等同于前个例子写入的. 注 意在这个例子里读取是如何组织的, 同前面跟踪的相反. wc 为快速读被优化过, 因此绕 过了标准库, 试图一个系统调用读取更多数据. 你可从跟踪的读的行里看到 wc 是如何试 图一次读取 16 KB.
Linux 专家能够从 strace 的输出中发现更多有用信息. 如果你不想看到所有的符号, 你 可使用 efile 标志来限制你自己仅查看文件方法是如何工作的.
就个人而言, 我们发现 strace 对于查明系统调用的运行时错误是非常有用. 常常是应用 程序或演示程序中的 perror 调用不足够详细, 并且能够确切说出哪个系统调用的哪个参 数触发了错误是非常有帮助的.
linux strace 命令的更多相关文章
- Linux strace命令
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...
- linux strace 命令详解
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...
- Linux strace命令 一
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核 ...
- Linux strace命令详解
Linux抓取TCP的命令: tcpdump ps -ef 参数命令详解: Linux下一切皆文件,我们打开一个socket,实际上也是打开了一个文件 我们打开一个网卡,实际上也是调用Linux系统的 ...
- Linux strace命令使用详解
strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息. 可谓是 linux 下的调试利器,不仅可以用来找程序错误,系统为什么挂死了,命令为什么报错 ...
- (转)Linux strace命令
原文:https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html https://linux.cn/article-6444-1 ...
- Linux strace命令(转载)
转载:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. ...
- linux跟踪线程的方法:LWP和strace命令
摘要:在使用多线程程序时,有时会遇到程序功能异常的情况,而这种异常情况并不是每次都发生,很难模拟出来.这时就需要运用在程序运行时跟踪线程的手段,而linux系统的LWP和strace命令正是这种技术手 ...
- strace命令 二
让我们看一台高负载服务器的 top 结果: top 技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序. 在本例中大家很容易发现 CPU 主要是被若干个 PHP ...
随机推荐
- 如何用SPSS分析学业情绪量表数据
如何用SPSS分析学业情绪量表数据 1.数据检验.由于问卷.量表的题目是主观判断和选择,因而难免有些人不认真填,所以,筛选出有效.高质量的数据非常关键.通常需要作如下检查:(1)是否有人回答互相矛盾, ...
- nodeJs学习-17 博客案例
源码:智能社视频20节课件 const express=require('express'); const static=require('express-static'); const cookie ...
- TZOJ4777: 方格取数
4777: 方格取数 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 11 ...
- iOS 9开发小技巧
http://www.cocoachina.com/ios/20151217/14733.html 前言 "小黄鸭"法不仅适用于debug,也适用于学习新知识.表达是最好的吸收.本 ...
- vue @click.native
1,给vue组件绑定事件时候,必须加上native ,不然不会生效(监听根元素的原生事件,使用 .native 修饰符) 2,等同于在自组件中: 子组件内部处理click事件然后向外发送click事件 ...
- oralce where字句的用法
? 如何显示工资高于3000的员工 select * from emp where sal>3000; ? 如何查找1982.1.1后入职的员工 select * fro ...
- 转载 LibGDX: 使用 Gradle 命令运行和打包项目
版权声明:本文为csdn xietansheng 博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: http://blog.csdn.net/xieta ...
- init()方法必须使用super.init(config)的原因--Servlet
原 因: 一个servlet在它的init()方法中传递它的ServletConfig实例,在其他的方法中却不可以.当一个servlet在 init()方法外需要调用config对象时就会产生问题.使 ...
- ROS出现“Couldn't find executable named listener below //home/xxx/catkin_ws/src/mypack”问题
在执行节点时出现了如下图所示的错误: 错误原因是在路径下找不到可执行的节点文件.但事实是已经对工作空间进行了编译,并且在devel /lib/my_serial_node 中已经生成了可执行文件. 如 ...
- async/await运用-前端表单弹窗验证同步书写方式(React)
在前端项目中,我们经常会碰到这样的场景: 当前我们有一个表单需要填写,在完成表单填写后经过校验之后会弹出短信或者其他形式验证码,进行补充校验,然后一起提交给接口. 场景如下图: 当前为创建操作,编辑操 ...