strace用法
strace -- trace system calls and signals strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息。
在最简单的情况下,strace追踪指定的指令,直到它退出。strace可以拦截并记录进程的系统调用和进程接收到的信号。你不仅可以从命令行调试一个新开始的程序,也可以把strace绑定到一个已有的PID上去。
strace三个最常用的参数:
-f: 除了跟踪当前进程外,还跟踪其子进程。
-o file: 默认情况下strace打印输出到标准错误,可以使用-o选项输出到指定的文件。
-p pid: 指定需要跟踪的进程pid
-t : 打印跟踪输出中每一行的时间
-T: 显示程序进行的每个系统调用开始和结束之间的时间差
-c: 可以生成每个系统调用的总时间,调用和错误报告。
-i: 显示程序在每次系统调用时的指针
-e trace=network : 只记录和网络api相关的系统调用
strace -f -o vim.strace vim:跟踪vim及其子进程的运行,将输出信息写到vim.strace文件中。
1.跟踪Linux 命令的系统调用,可以简单的使用strace 运行一个命令,这里使用df命令做一个演示:
[root@localhost ~]# strace df -h
execve("/bin/df", ["df", "-h"], [/* 23 vars */]) = 0
brk(0) = 0x983000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4bc0578000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=54957, ...}) = 0
mmap(NULL, 54957, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f4bc056a000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\356\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1924768, ...}) = 0
mmap(NULL, 3750184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f4bbffc5000
.......
跟踪中的每一行都包含系统调用名称,后跟括号中的参数及其返回值。
从上面的输出中,可以看到由df -h命令进行的各种类型的系统调用。
open("/etc/ld.so.cache", O_RDONLY) = 3
open ---->是一个系统调用函数
("/etc/ld.so.cache", O_RDONLY) ------>是系统调用函数的参数
3 ---->系统调用的返回值
可以使用strace寻找被程序读取的配置文件,例如:
[root@localhost ~]# strace -e trace=open mysql | grep my.cnf
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libpthread.so.0", O_RDONLY) = 3
open("/lib64/librt.so.1", O_RDONLY) = 3
open("/lib64/libdl.so.2", O_RDONLY) = 3
open("/lib64/libncurses.so.5", O_RDONLY) = 3
open("/usr/lib64/libstdc++.so.6", O_RDONLY) = 3
open("/lib64/libm.so.6", O_RDONLY) = 3
open("/lib64/libgcc_s.so.1", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY) = 3
open("/lib64/libtinfo.so.5", O_RDONLY) = 3
open("/etc/my.cnf", O_RDONLY) = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/services", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/usr/local/mysql/share/charsets/Index.xml", O_RDONLY) = 3
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
+++ exited with 1 +++
-e trace=open 展示特定的系统调用(还可以使用write、network等等man strace有详细说明)
还可以显示时间戳 -tt选项可以展示微秒级别的时间戳。
[root@localhost ~]# strace -t ls
:: execve("/usr/bin/ls", ["ls"], [/* 26 vars */]) =
:: brk(NULL) = 0x154b000
:: mmap(NULL, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -, ) = 0x7f33240bf000
:: access("/etc/ld.so.preload", R_OK) = - ENOENT (No such file or directory)
:: open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) =
:: fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
:: mmap(NULL, , PROT_READ, MAP_PRIVATE, , ) = 0x7f33240b4000
:: close() =
:: open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) =
:: read(, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300j\0\0\0\0\0\0"..., ) =
:: fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
:: mmap(NULL, , PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, , ) = 0x7f3323c78000
:: mprotect(0x7f3323c9c000, , PROT_NONE) =
:: mmap(0x7f3323e9b000, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, , 0x23000) = 0x7f3323e9b000
:: mmap(0x7f3323e9d000, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -, ) = 0x7f3323e9d000
:: close() =
strace用法的更多相关文章
- strace用法说明
strace命令详解strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. strace 显示这些调用的参数并返回符号形式的值.strace 从内核接收信息,而且不需要以任何 ...
- 使用strace命令跟踪系统调用
一.是什么strace? strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由 ...
- 28、应用调试之strace命令来跟踪系统调用
strace是个工具,在使用时需要先按照,见韦东山书籍: 1.tar xjf starce-4.5.15.tar.bz2 2.cd strace-4.5.15/ 3.patch -p1 < .. ...
- 【Linux】【Commands】trouble shooting命令详解目录
1. 简介 1.1. 最近看到阿里的运维招聘需要熟练掌握以下的命令,我就针对这几个命令做一下总结,有些命令我觉得别人总结的挺好了,我就不赘述了 1.2. 还有一些其他我觉得用得到的命令的用法会在第三部 ...
- strace命令简单用法
strace可以显示一个程序经历的系统调用,接收到的信号等信息. 用法: 1.strace -ff -o output programName 将程序programName的写入output文件中,- ...
- linux的strace命令用法
strace命令用法 调用:strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] …[ -ofile ] [ -ppid ] … [ -sstrsize ...
- 主机管理+堡垒机系统开发:strace命令用法详解(六)
一.简单介绍 strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进 ...
- LINUX的STRACE命令用法 [转]
调用:strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ...[ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -u ...
- [转帖]强大的strace命令用法详解
强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...
随机推荐
- vuex初使用(写的当然是最简单的应用啦)
关于vuex的简图 vuex文档:https://vuex.vuejs.org/zh-cn/installation.html 一:npm安装 npm install vuex --save 在mai ...
- Struts2拦截器再认识
拦截器(Interceptor)是 Struts 2 的核心组成部分. Struts2 很多功能都是构建在拦截器基础之上的,例如文件的上传和下载.国际化.数据类型转换和数据校验等等. Struts2 ...
- 【手撸一个ORM】第八步、查询工具类
一.实体查询 using MyOrm.Commons; using MyOrm.DbParameters; using MyOrm.Expressions; using MyOrm.Mappers; ...
- js和jq中常见的各种位置距离之offset()和position()的区别(二)
offset()返回的是相对于当前文档的坐标,position()返回的是相对于其定位的祖辈元素的坐标. 使用position()方法时事实上是把该元素当绝对定位来处理,获取的是该元素相当于最近的一个 ...
- CS round--36
https://csacademy.com/contest/round-36/summary/ C题是一个贪心,最坏情况是,一开始肯定是每一对袜子都抽一个,然后就需要N个袜子了.后面的情况就是相同的了 ...
- 开发工具~nuget配置本地源
我们在本地部署了自己的nuget服务器,有时可以需要用到nuget restore命令去恢复包包,它会从下面的nuget.config里读你的配置源信息,就是在这里,我们要把内测的nuget服务器路径 ...
- SpringMVC对HTTP报文体的处理
客户端和服务端HTTP报文传递消息,而HTTP报文包含报文头和报文体.通常,解析请求参数以及返回页面都不需要我们关心HTTP报文体的读取和生成过程.但在某些特定场景下需要直接到请求报文中读取报文体, ...
- jstl表达式的应用的条件
在el表达式中,有时我们要写for循环,这时我们要写 <c:forEach items="${list}" var="news" > </c: ...
- jsonp, json区别
JSONP由两部分组成: 回调函数和数据 回调函数是接收到响应时应该在页面中调用的函数,其名字一般在请求中指定. 数据是传入回调函数中的JSON数据. jsonp var script=documen ...
- put_user
1. put_user Name put_user -- Write a simple value into user space. Synopsis put_user ( x, ptr); A ...