博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用户态调测工具(一):strace和ltrace
阅读量:2496 次
发布时间:2019-05-11

本文共 3634 字,大约阅读时间需要 12 分钟。

简单科普:Linux的用户态和内核态

Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件–控制计算机的硬件资源,并提供上层应用程序运行的环境。

用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。
一般来说系统调用经过:用户调用syscall->glibc库->内核执行,返回值->glibc库->syscall->用户。
除非内核提供接口,否则用户态无法访问到内核资源。

Strace常用来跟踪进程在用户态执行的系统调用流程,单不会跟踪到内核里面发生的事情(顺便提一句,内核里面用ftrace)。

输出含义

以strace ls为例:

$ strace lsexecve("/bin/ls", ["ls"], [/* 26 vars */]) = 0brk(NULL) = 0x1ad4000access("/etc/ld.so.nohwcap", FOK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f397bd49000 access("/etc/ld.so.preload", ROK) = 0

每一行都是一条系统调用,包含调用函数,函数参数,函数返回值,但不会显示内核的系统调用和流程。

参数

说明:随着系统的不同和工具包的升级,不同环境命令支持情况也不相同,个人最好养成查看命令帮助使用command –help的习惯。

-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 column设置返回值的输出位置.默认 为40.-e expr指定一个表达式,用来控制如何跟踪.格式如下:[qualifier=][!]value1[,value2]…qualifier只能是 trace,abbrev,verbose,raw,signal,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(或者signal=!io),表示不跟踪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执行被跟踪的命令

内容解析(strace ls为例)

一般strace的打印内容,我会作为3块来看:

1)系统环境调用,主要是加载命令或二进制所依赖的环境和库

execve("/bin/ls", ["ls"], [/* 26 vars /]) = 0 brk(NULL) = 0xd9f000 access("/etc/ld.so.nohwcap", FOK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f8f45df5000 access("/etc/ld.so.preload", ROK) = 0加载系统/etc里面的配置文件access("/etc/ld.so.nohwcap", FOK) = -1 ENOENT (No such file or directory) open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|OCLOEXEC) = 3加载libc.so C库

2)该命令和二进制执行流程

open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3fstat(3, {st_mode=S_IFDIR|0775, stsize=4096, …}) = 0 getdents(3, / 4 entries /, 32768) = 120 getdents(3, / 0 entries */, 32768) = 0close(3) = 0fstat(1, {st_mode=S_IFREG|0664, stsize=8230, …}) = 0write(1, "log\nmachinelearninginaction\n", 28logmachinelearninginaction) = 28

我们可以看到,大概流程包括open当前目录、得到当前目录文件信息(名称、权限、大小等),打印到控制台

3)返回值

close(1) = 0close(2) = 0exit_group(0) = ?+++ exited with 0 +++

正常则返回0,如果出现异常,会返回异常SIG。

个人认为主要用途

作为命令或可执行文件执行失败时,失败位置定位和失败原因查看的非常方便的工具。

个人常用作:
系统命令执行失败纠错;
某服务start/stop执行失败原因查看,比如未找到/etc/下配置文件,打开/etc/下配置文件失败(权限不够)等问题;
系统调用执行失败,如顺便可查看系统调用流程,失败位置,失败原因等;

6.对应工具ltrace

ltrace同strace作为用户态调测工具,打印进程的库函数调用,但个人不太常用:

memcpy(0x216e2a0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"…, 56) = 0x216e2a0__errno_location() = 0x7f345a2476b8malloc(56) = 0x216e2e0memcpy(0x216e2e0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"…, 56) = 0x216e2e0getenv("TZ") = nilmalloc(128) = 0x216e320malloc(19200) = 0x216e3b0malloc(32) = 0x216d090

这里写图片描述

你可能感兴趣的文章
【转】关于 Nokogiri 的安装依赖 libxml2安装问题
查看>>
override (C# Reference)
查看>>
如何查看postfix的版本
查看>>
关于SQL表联接
查看>>
实验3
查看>>
完成登录与注册页面的前端
查看>>
Network Mapper 嗅探工具
查看>>
linux下定时执行任务的方法
查看>>
ASP.NET MVC 常用内置验证特性 简介
查看>>
tuple有无list对key的影响
查看>>
java study3
查看>>
优秀的后台管理界面设计案例分享
查看>>
在VIM中使用GDB调试 – 使用vimgdb
查看>>
数据挖掘中哪些算法使用率较高?
查看>>
编程算法 - 推断二叉树是不是平衡树 代码(C)
查看>>
MySpring dataSource从配置文件获取
查看>>
矩阵的转置
查看>>
如何为SharePoint文档库、文件夹、文件单独设置权限
查看>>
【Linux】linux中很有用的指令(练习)
查看>>
C# 抽象(2)
查看>>