strace常用命令学习

strace是一个非常简单的工具,它可以跟踪系统调用的执行。它常用来跟踪进程执行时的系统调用和所接受的信号。在调试的时候,strace能帮助我们追踪到一个程序所执行的而系统调用。当我们想知道程序和操作系统如何交互的时候,这时极其方便的,比如我们想知道执行了哪些系统调用,并且以何种顺序执行。我们知道,在linux中,进程不能直接访问硬件设备,当进程需要直接访问硬件设备(比如读取磁盘文件,接受网络数据时),必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strance可以追踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间等等。

同时,strance是一个集诊断,调试,统计于一体的工具。我们可以使用strance对应用的的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。

我们先来看看strace的命令都有哪些:

接下来我们通过一个打印“hello world”小程序来练习上面一些常用的选项:

从上面我们可以看到,当我们用strace执行test时,系统首先调用execv函数开始一个新的进程,接着进行一些环境初始化的一些操作,然后再调用write函数将“hello world”输出到屏幕上,最后调用exit_group退出,就这样完成整个程序的执行过程。

用-s参数实现截断输出:

-s参数用来指定trace的结果的每一行的输出长度,同样还是上面的程序,我们看看加了-s参数后的变化:

从上面的结果我们可以看到,本来我们是要输出“hello world”的,当我们加上-s 选项之后,输出了“hell”,实现了截断。

我们再来看看strace的跟踪信号传递功能:

我们这里还用上面的test程序,来观察进程接受信号的情况。我们先strace ./test,然后打开另外一个窗口,输入如下的命令 killall test,这时我们会看到程序退出了,结果如下:

上面的现象可以体现出来用strace可以跟踪进程执行时所接受的信号。

用-c参数还能将进程所有的系统调用做一个统计分析,如下的现象:

从上图我们可以很清楚的知道我们执行一个进程时,调用了哪些系统函数,调用的次数,消耗的时间等信息,这对我们分析一个程序来说是非常有用的。

用-o选项实现重定向输出:参数-o用于将strace的输出重定向到文件中,如果不指定-o的话,默认的输出是stderr,格式是 -o filename,和使用2 > filename是一样的。我们来看看:

用-T选项可以打印出每个系统调用所花费的时间,也就是每行最右边的尖括号里面(我在图中用红颜色的框画出来的)。这是一个很有用的功能,strace会将系统调用每次的时间记录下来,我们可以使用-t/tt/ttt看到,比如下面:

我们来说一下这三个参数的区别:-t 输出结果精确到秒,-tt输出结果精确到微秒,-ttt精确到微秒,而且时间表示为unix时间戳。

用-p追踪一个现有的进程,用法是 strace -p pid,我们看如下例子:

我们的程度是先获得进程的id,并输出“hello world”,然后sleep 30秒,在这期间,我们用strace追踪该进程,输出上图的信息,30秒后,进程结束,死奥用seit_group函数。

用-e选项来进行特定的系统调用(例如open,write)等:

如上,我们我规定查看open的系统调用,并输出了相应的信息。

用-r参数展示系统调用之间的相对时间戳:

其他选项的例子就不一一例举了,以上几个选项时比较常用的。

时间: 2024-10-10 05:11:00

strace常用命令学习的相关文章

mysql常用命令学习

1.\c取消当前准备执行的sql语句. mysql> select user,host,password from mysql.user;\c +--------+-----------+----------+ | user   | host      | password | +--------+-----------+----------+ | root   | localhost |          | | root   | mytest2   |          | | root  

linux 几个不常用命令学习 之 cal 命令

看了极客里面的文章:一些实用但不为人知的unix命令 文章参考:http://blog.jobbole.com/66590/ 准备好好学习下这些命令,成为Linux高手 这次学习显示日历命令:cal #显示日历,默认格式 $ cal 五月 2014 日 一 二 三 四 五 六 1  2  3 4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #默认日历显示是从星期天作为第一天,你也

Linux的几个概念,常用命令学习

Linux的几个概念,常用命令学习---------------------------------设备名装载点// 通过装载点访问设备---------------------------------根目录:cd /主目录:cd ~ // 不同的用户有不同的主目录,但拥有相同的根目录----------------------------------点文件:以点开头的文件或目录,可以作为隐藏目录ls 不显示ls -a 显示--------------------------------标准子目

(转) Git版本控制软件结合GitHub从入门到精通常用命令学习手册

转载自:爱分享 » Git版本控制软件结合GitHub从入门到精通常用命令学习手册 原文传送门: http://www.ihref.com/read-16369.html 注意: 学习前请先配置好Git客户端 相关文章:Git客户端图文详解如何安装配置GitHub操作流程攻略 官方中文手册:http://git-scm.com/book/zh GIT 学习手册简介 本站为 Git 学习参考手册.目的是为学习与记忆 Git 使用中最重要.最普遍的命令提供快速翻阅. 这些命令以你可能需要的操作类型划

Linux系统管理常用命令学习

在前面的Blog中给大家介绍了Linux安装和目录结构的相关知识,今天我们将正式的走进Linux系统,本期的内容如下: 1.Linux命令功能简单介绍 2.Linux系统管理常用命令 3.Linux系统管理常用热键 4.获取Linux命令帮助 5.内容总结 一.Linux命令功能介绍 首先介绍一个名词"控制台(console)",它就是我们通常见到的使用字符操作界面的人机接口,例如dos.我们说控制台命令,就是指通过字符界面输入的可以操作系统的命令,例如dos命令就是控制台命令.我们现

Linux常用命令学习

补充: 管道符号:   | 含义: 命令1 的正确输出作为命令2的输出对象. 格式: 命令1   |  命令2 举例: ls -ctrl |  more 常用命令: netstat   -an    |  grep    ESTABLISHED         查看正在连接的端口 netstat   -an    |   grep   LISTEN find   .    -name   test.txt    |     cat    -n          在当前目录下找到文件名为test.

Linux部分常用命令学习(一)

什么是linux命令? 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样. 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等. 是一个内建于 shell 自身的命令.bash 支持若干命令,内部叫做 shell 内部命令 (builtins).例如,上面我本地环境中的cd命令,就是一个 shell 内部命令. 是一个 shell 函数.这些是小规模的 s

(4)Linux常用命令学习

Linux常用命令 一.命令基本格式 命令 [选项]  [参数] 注意:个别命令使用不遵循此格式,当有多个选项时,可以写在一起.简化选项与完整选项 -a 等于 --all [[email protected] ~]# 其中: root:            当前登录用户 localhost:             主机名 ~                          当前所在目录(家目录) #                          超级用户的提示符 普通用户的提示符是$

mondb 常用命令学习记录

一.MongoDB 下载安装 MongoDB官网 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center#community MongoDB for Windows 64-bit 适合 64 位的 Windows Server 2008 R2, Windows 7 , 及最新版本的 Window 系统. MongoDB for Windows