【我的Linux,我做主!】strace指令调试详解

目录:
(一)strace命令简介
(二)strace命令实战



(一)strace命令简介
(1.1)strace命令主要是用来监控我们程序的执行情况,当我们在Linux系统的用户空间运行一个程序的时候,Linux系统会将我们运行的程序封装成一个进程的形式,然后参与操作系统的调度,因此我们可以使用strace命令去跟踪我们的应用程序它的相关的运行情况,比如监控用户进程与内核进程的交互,以及跟踪进程的系统调用、信号传递、状态变化等。此时我们都可以通过这个strace命令去调试我们程序具体出错的原因。
(1.2)一般我们的系统调用主要包括①文件和设备访问:open、close、read、write、ioctl等;②进程管理:fork、clone、execve、exit等;③信号:signal、kill等;④内存管理:brk、mmap、mlock等;⑤进程间通信:semget、信号量、消息队列等;⑥网络通信:socket、connect等。
(1.3)strace命令的参数及含义如下所示:
-c:统计每一系统调用的所执行的时间,次数和出错的次数等
-d:输出strace关于标准错误的信息
-f:跟踪由fork调用所产生的子进程
-ff:如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程号
-F:尝试跟踪vfork调用,在-f时,vfork不被跟踪
-h:输出简要的帮助信息
-i:输出系统调用的入口指针
-q:禁止输出关于脱离的消息
-r:打印出相对时间关于每一个系统调用
-t:在输出中的每一行前加上时间信息
-tt:在输出中的每一行前加上时间信息,微秒级
-ttt:微秒级输出,以秒表示时间
-T:显示每一调用所耗的时间
-v:输出所有的系统调用,一些调用关于环境变量、状态、输入、输出等调用由于使用频繁,默认不输出
-V:输出strace版本信息
-x:以十六进制形式输出非标准字符串
-xx:所有字符串以十六进制形式输出
-a cloumn:设置返回值的输出位置,默认为40
-e [expr]:指定一个表达式,用来控制如何跟踪,格式[qualifier=][!]value1[,value2]
qualifier只能是trace,abbrev,verbose,raw,singal,[read],[write]其中之一,value是用来限定的符号或数字,默认的qualifier是trace,感叹号是否定符号。例如:-eopen等价于-e trace=open,表示只跟踪open调用,而-etrace!=open表示跟踪除了open以外的其他调用,有两个特殊的符号all和none,注意有些shell使用!来执行历史记录里的命令,所以要使用\
-e trace=[set]只跟踪指定的系统,调用,例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用。默认的为set=all
-e trace=[file]只跟踪有关文件操作的系统调用
-e trace=process只跟踪有关进程控制的系统调用
-e trace=network跟踪与网络有关的所有系统调用
-e strace=signal跟踪所有与系统信号有关的系统调用
-e trace=ipc跟踪所有与进程通讯有关的系统调用
-e abbrev=set设定strace输出的系统调用的结果集,-v等与abbrev=none,默认为abbrev=all
-e raw=set将指定的系统调用的参数以十六进制显示
-e signal=set指定跟踪的系统信号,默认为all,如signal=!SIGIO,表示不跟踪SIGIO信号
-e read=set输出从指定文件中读出的数据,例如:-e read=3,5
-e write=set输出写入到指定文件中的数据
-o filename将strace的输出写入文件filename
-p pid跟踪指定的进程pid
-s strsize指定输出的字符串的最大长度,默认为32,文件名一直全部输出
-u username以username的UID和GID执行被跟踪的命令
(1.4)我们在系统中编辑一个strace.c的程序文件,然后写上如下的一段代码(图1-1),然后使用gcc编译strace.c程序后,在系统中会自动生成一个a.out的可执行文件,此时我们执行a.out的文件后系统出现了报错并生成了一个test.dat的文件(图1-2)。


(1.5)此时我们可以使用strace命令查看./a.out执行的时候相关系统调用的过程。
# strace ./a.out---查看./a.out执行的时候相关系统调用的过程



(二)strace命令实战
(2.1)查看一个程序所有的open、close系统调用。
# strace -e open,close ./a.out---使用-e参数查看a.out执行文件的open和close的调用情况

(2.2)查看每个系统调用消耗的时间。
# strace -T -e open,close ./a.out---我们使用-T参数可以查看系统每个系统调用所消耗的时间

(2.3)统计系统调用次数、错误次数统计。
# strace -c -e open,close ./a.out---使用-c参数查看系统调用次数和错误次数统计

(2.4)打印系统调用的时间戳。
# strace -t -T -e open,close ./a.out---使用-t命令可以查看系统调用的时间戳
# strace -tt -T -e open,close ./a.out---此时我们可以查看微秒级的系统调用的时间戳


(2.5)将跟踪日志保存到log文件中。
# strace -tt -T -e open,close -o log ./a.out---我们可以使用-o参数将跟踪日志保存到log文件中

(2.6)最后我们再来分析一下使用strace -e来查看open系统调用后的问题与状态,当我们打开一个文件是成功的时候,那么系统会返回一个非负整数,所以系统在打开test.dat文件时,会返回一个3值,但是如果我们打开一个文件是失败的,那么系统会返回一个负数,所以此时系统打开并不存在的hello.dat文件时,返回的是-1值。由此我们便可以实现通过strace命令来查找程序运行报错原因的目标。
# strace -e open ./a.out---查看一个程序所有的open系统调用

—————— 本文至此结束,感谢阅读 ——————

原文地址:https://blog.51cto.com/13613726/2461841

时间: 2024-10-24 11:51:56

【我的Linux,我做主!】strace指令调试详解的相关文章

Linux用户态程序计时方式详解

前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产生影响. 本文将不考虑这些影响因素(相关资料可参考<深入理解计算机系统>一书),而仅仅关注Linux系统中用户态程序执行时间的计算方式.除本文所述计时方式外,还可借助外部工具统计耗时,如<Linux调试分析诊断利器——strace>一文中介绍的strace. 本文示例代码的运行环

linux添加开机自启动脚本示例详解

来源: linux添加开机自启动脚本示例详解 linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加如果不想将脚本粘来粘去,或创建链接什么的,则:step1. 先修改好脚本,使其所有模块都能在任意目录启动时正常执行;step2. 再在/etc/rc.local的末尾添加一行以绝对路径启动脚本的行;如:$ vim /etc/rc.local#!/bin/sh## This script will be executed *after*

linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)

linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至: linux dd命令使用详解 dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file 输入文件名,缺省为标准输入. of=file 输出文件名,缺省为标准输出. ibs=bytes 一次读入 bytes 个字节(即一个块大小为 bytes 个字节). obs=b

Linux tar 命令参数及用法详解--Linux打包备份命令

linux tar命令参数及用法详解--linux打包备份命令 tar命令 tar - tar 档案文件管理程序的 GNU 版本.下面将逐个介绍其含义tar [-cxtzjvfpPN] 文件与目录 ....常用参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件!特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩.-z :是否同时具有 gzip 的属性?亦即是否需

Linux和Windows下ping命令详解

转:http://linux.chinaitlab.com/command/829332.html 一.Linux下的ping参数 用途 发送一个回送信号请求给网络主机. 语法 ping [ -d] [ -D ] [ -n ] [ -q ] [ -r] [ -v] [ \ -R ] [ -a addr_family ] [ -c Count ] [ -w timeout ] [ -f | -i \ Wait ] [ -l Preload ] [ -p Pattern ] [ -s PacketS

Linux系统调用--getrlimit()与setrlimit()函数详解

http://www.cnblogs.com/niocai/archive/2012/04/01/2428128.html 功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值.非授权调 用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制.授权进程可以任意改变其软硬限制.RLIM_INFINITY的 值表示不对资源限制. 用法: #include <sys/resource.h>int getr

linux cp命令参数及用法详解---linux 复制文件命令cp

linux cp命令参数及用法详解---linux 复制文件命令cp [[email protected]Linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)[[email protected]linux ~]# cp [options] source1 source2 source3 -. directory参数:-a :相当于 -pdr 的意思:-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身:-

Linux Crontab [定时任务] 命令与参数详解

crontab命令常用于Unix和Linux系统中,用于设置周期性被执行的指令. 该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供读取和执行. 通常,crontab储存的指令被守护进程激活,crond服务常常在后台运行. 通过设定的时间来检查是否有作业需要执行,这类作业一般称为:cron jobs. crontab 文件 crontab文件包含送交cron守护进程的一系列作业和指令. 每个用户可以拥有自己的crontab文件,同时操作系统保存一个针对整个系统的crontab文

【转】Linux下Android ADB驱动安装详解

原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比较多,本人使用的Ubuntu系统好多厂商的Android手机都无法正确的识别,经过一番折腾,和查阅SDK,现把Linux下ADB驱动配置的方法和当中会遇到的相关问题的解决方法整理出来贡献给大家. Linux下使用手机USB调试模式连接ADB进行Android程序的调试,配置驱动没有Windows来的