您现在的位置:首页 >> 建材导购

Linux诊断、调试在手strace命令详解

发布时间:2025/08/15 12:19    来源:涡阳家居装修网

,给予的设备负责管理、缓存负责管理、护航调度等特性。其他用户自由空间通过API请求多线程自由空间的咨询服务来收尾其特性——多线程给予给其他用户自由空间的这些API, 就是种系统兄程序。

在Linux种系统上,系统性方法比如说通过glibc坎填充的formula_,间接运用以种系统兄程序。

Linux多线程目之前有300多个种系统兄程序,详尽的列表可以通过syscalls指南页提示。这些种系统兄程序主要分为一般来说:

明文和的设备出访类 比如open/close/read/write/chmod等发挥作用负责管理类 fork/clone/execve/exit/getpid等讯号类 signal/sigaction/kill 等缓存负责管理 brk/mmap/mlock等发挥作用间通信IPC shmget/semget * 讯号量,虚拟化,通告队列等单片机 socket/connect/sendto/sendmsg 等其他

熟识Linux种系统兄程序/种系统程序设计,并不需要让我们在运用以strace时得心应手。不过,对于运维的疑问应在位来说是,发觉strace这个方法,但会查种系统兄程序指南,就非常少不够了。

想要深入知晓的同窗,建议读到《Linux种系统程序设计》, 《Unix环境高级程序设计》等参考书。

我们回到strace的运用以先是。strace有两种接入种系统。

一种是通过它启动时要搜寻的发挥作用。名词很非常简单,在取而代之的指令之前连带strace无需。比如我们要搜寻 "ls -lh /var/log/messages" 这个指令的分受命,可以这样:

strace ls -lh /var/log/messages

另外一种接入种系统,是搜寻早就在接入的发挥作用,在不中都断发挥作用分受命的情形下,了解它在家伙。 这种情形,给strace递送至个-p pid 可选择无需。

比如,有个在接入的some_server咨询服务,第一步,提示pid:

pidof some_server 17553

想得到其pid 17553然后就可以用strace搜寻其分受命:

strace -p 17553

收尾搜寻时,按ctrl + C 完结strace无需。

strace有一些可选择可以调整其引径,我们这里介绍下其中都几个相当常以的,然后通过比如说简介其实际上系统性方法精准度。

strace常以可选择:

从一个比如说指令来看:

strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489

-tt 在每引支配器的之末尾,推测毫秒级别的间隔时间-T 推测每次种系统兄程序大概掉的间隔时间-v 对于某些特别兄程序,把清晰的default,明文stat本体等打出来。-f 搜寻要能发挥作用,以及要能发挥作用创建者的所有兄发挥作用-e 支配要搜寻的事件和搜寻引径,比如均须要搜寻的种系统兄程序名称-o 把strace的支配器原则上写就到均须的明文-s 当种系统兄程序的某个常量是字符串时,最多支配器均须长度的主旨,配置明文是32个二进制-p 均须要搜寻的发挥作用pid, 要同时搜寻多个pid, 减法多次-p可选择无需。

实例:搜寻nginx, 看其启动时时都出访了哪些明文

strace -tt -T -f -e trace=file -o /data/log/strace.log -s 1024 ./nginx

大多支配器:

支配器中都,第一列推测的是发挥作用的pid, 接着是毫秒级别的间隔时间,这个是-tt 可选择的精准度。

每偷偷地的最终一列,推测了该兄程序大概的间隔时间,是-T可选择的结果。

这里的支配器只推测和明文出访有关的主旨,这是因为我们通过-e trace=file 可选择均须了。

strace疑问应在位系统性

1、应在位发挥作用出现异常淡出

疑问:方法上有个又叫run.sh的常驻CGI,接入一分钟后但会死掉。必需追查病因。

应在位:发挥作用还在接入时,通过ps指令赚取其pid, 断言我们想得到的pid是24298

strace -o strace.log -tt -p 24298

提示strace.log, 我们在最终2引认出如下主旨:

22:47:42.803937 wait4(-1, 22:47:43.228422 +++ killed by SIGKILL +++

这里可以显露,发挥作用是被其他发挥作用用KILL讯号斩逃脱的。

无论如何,通过系统性,我们找到方法上别的咨询服务有个搜寻CGI,它搜寻一个也又叫run.sh的发挥作用,当找到run.sh发挥作用数极小2时,就但会把它斩逃脱重启。结果导致我们这个run.shCGI被误斩杀。

发挥作用被斩杀淡出时,strace但会支配器killed by SIGX(SIGX都是递送到发挥作用的讯号)等,那么,发挥作用自己淡出时但会支配器什么呢?

这里有个又叫test_exit的机制,其比如说如下:

#include #include int main(int argc, char **argv) { exit(1);}

我们strace看下它淡出时strace上能认出什么痕迹。

strace -tt -e trace=process -f ./test_exit

所述: -e trace=process 透露只搜寻和发挥作用负责管理特别的种系统兄程序。

支配器:

23:07:24.672849 execve("./test_exit", ["./test_exit"], [/* 35 vars */]) = 023:07:24.674665 arch_prctl(ARCH_SET_FS, 0x7f1c0eca7740) = 023:07:24.675108 exit_group(1) = ?23:07:24.675259 +++ exited with 1 +++

可以显露,发挥作用自己淡出时(兄程序exitformula_,或者从mainformula_赶回), 最终兄程序的是exit_group种系统兄程序, 并且strace但会支配器exited with X(X为淡出码)。

似乎有人但会疑惑,比如说;还有就让兄程序的是exit, 怎么推测为exit_group?

这是因为这里的exitformula_不是种系统兄程序,而是glibc坎给予的一个formula_,exitformula_的兄程序最终但会转化为exit_group种系统兄程序,它但会淡出当之前发挥作用的所有线程。无论如何,有一个又叫_exit()的种系统兄程序(肯定exit之末尾的逗号), 线程淡出时最终但会兄程序它。

2、应在位虚拟化出现异常

有个咨询服务启动时时报错:

shmget 267264 30097568: Invalid argumentCan not get shm...exit!

差错记事大概得知我们是赚取虚拟化犯错,通过strace看下:

strace -tt -f -e trace=ipc ./a_mon_svr ../conf/a_mon_svr.conf

支配器:

22:46:36.351798 shmget(0x5feb, 12000, 0666) = 022:46:36.351939 shmat(0, 0, 0) = ?Process 21406 attached22:46:36.355439 shmget(0x41400, 30097568, 0666) = -1 EINVAL (Invalid argument)shmget 267264 30097568: Invalid argumentCan not get shm...exit!

这里,我们通过-e trace=ipc 可选择,让strace只搜寻和发挥作用通信特别的种系统兄程序。

从strace支配器,我们发觉是shmget种系统兄程序犯错了,errno是EINVAL。或多或少, 查询下shmget指南页,侦查EINVAL的差错码的所述:

EINVAL A new segment was to be created and size SHMMAX, or no new segment was to be created, a segment with given key existed, but size is greater than the size of that segment

翻译成下,shmget设立EINVAL差错码的状况为下列之一:

要创建者的虚拟化段比 SHMMIN小 (一般是1个二进制)要创建者的虚拟化段比 SHMMAX 大 (多线程常量kernel.shmmax配置)均须key的虚拟化段已依赖于,其尺寸和兄程序shmget时递送至的取值多种不同。

从strace支配器看,我们要连的虚拟化key 0x41400, 均须的尺寸是30097568二进制,显着与第1、2种情形不转换。那只剩下第三种情形。运用以ipcs看下有否一定会是尺寸不转换:

ipcs -m | grep 41400key shmid owner perms bytes nattch status 0x00041400 1015822 root 666 30095516 1

可以认出,早就0x41400这个key早就依赖于,并且其尺寸为30095516二进制,和我们兄程序常量中都的30097568不转换,于是造成了这个差错。

在我们这个系统性;还有,导致虚拟化尺寸不明确的状况,是一组机制中都,其中都一个程式码为32位,另外一个程式码为64位,比如说;还有运用以了long这个变长int表达式。

把两个机制都程式码为64解决了这个疑问。

这里特别说是下strace的-e trace可选择。

要搜寻某个明确的种系统兄程序,-e trace=xxx无需。但一般而言我们要搜寻一类种系统兄程序,比如所有和明文名有关的兄程序、所有和缓存分配有关的兄程序。

如果人工转换成每一个明确的种系统兄程序名称,似乎容易遗漏。于是strace给予了一般来说常以的种系统兄程序组合成取名。

-e trace=file 搜寻和明文出访特别的兄程序(常量中都有明文名)-e trace=process 和发挥作用负责管理特别的兄程序,比如fork/exec/exit_group-e trace=network 和单片机特别的兄程序,比如socket/sendto/connect-e trace=signal 讯号递送和解决疑问特别,比如kill/sigaction-e trace=desc 和明文刻画符特别,比如write/read/select/epoll等-e trace=ipc 发挥作用闻同窗特别,比如shmget等

绝大多数情形,我们运用以上面的组合成取名就不够了。实在必需搜寻明确的种系统兄程序时,似乎必需肯定C坎解决问题的区别。

比如我们发觉创建者发挥作用运用以的是fork种系统兄程序,但在glibc;还有,fork的兄程序无论如何同可逆到了更是顶层的clone种系统兄程序。运用以strace时,得均须-e trace=clone, 均须-e trace=fork什么也转换不上。

3、 性能系统性

假如有个需求,统计资料Linux 4.5.4 版本多线程中都的比如说年月(相关联概要和C比如说)。这里给予两个shellCGI解决问题:

poor_script.sh:

!/bin/bash

total_line=0while read filename; doline=$(wc -l $filename | awk ‘{print $1}’)(( total_line += line ))done < <( find linux-4.5.4 -type f ( -iname ‘.c’ -o -iname ‘.h’ -o -iname ‘*.S’ ) )echo “total line: $total_line”

good_script.sh:

!/bin/bash

find linux-4.5.4 -type f ( -iname ‘.c’ -o -iname ‘.h’ -o -iname ‘*.S’ ) -print0 | wc -l —files0-from - | tail -n 1

两段比如说解决问题的借此是一样的。 我们通过strace的-c可选择来分别统计资料两种版本的种系统兄程序情形和其大概的间隔时间(运用以-f同时统计资料兄发挥作用的情形)

从两个支配器可以显露,good_script.sh 只必需2秒就可以想得到结果:19613114引。它多数的兄程序(calls)开销是明文操作方法(read/open/write/close)等,统计资料比如说年月当初就是干这些好事。

而poor_script.sh收尾或多或少的护航则花了539秒。它多数的兄程序开销都在发挥作用和缓存负责管理上(wait4/mmap/getpid…)。

无论如何,从两个图中都clone种系统兄程序的至多,我们可以显露good_script.sh只必需启动时3个发挥作用,而poor_script.sh收尾整个护航没想到启动时了126335个发挥作用!

而发挥作用创建者和丢弃的代价是相当高的,性能不差才怪。

阐述

当找到发挥作用或咨询服务出现异常时,我们可以通过strace来搜寻其种系统兄程序,“想到它在干啥”,进而找到出现异常的状况。熟识常以种系统兄程序,并不需要更是好地了解和运用以strace。

当然,万能的strace也不是却是的万能。当要能发挥作用卡死在其他用户可逆时,strace就没有人支配器了。

这个时候我们必需其他的搜寻手段,比如gdb/perf/systemtap等。

标明:

1、perf状况kernel支持者

2、ftrace kernel支持者可程序设计

3、systemtap 特性强大,RedHat种系统支持者,对其他用户可逆,多线程可逆语义都能探查,运用以范围更是广

本文永久更是新绑定重定向:

书名绑定:

strace常以来搜寻发挥作用分受命时的种系统兄程序和所接管的讯号。 在Linux世界性,发挥作用不能同样出访系统性方法机制的设备,当发挥作用必需出访系统性方法机制的设备(比如载入磁盘明文,接管网络平台样本等等)时,必须由其他用户可逆种系统翻转至多线程可逆种系统,通 过种系统兄程序出访系统性方法机制的设备。strace可以搜寻到一个发挥作用造成的种系统兄程序,仅限于常量,formula_调用,分受命耗损的间隔时间。

strace指令是乒乓诊疗、调试、统计资料与并重的方法,我们可以运用以strace对系统性方法的种系统兄程序和讯号递送至的搜寻结果来对系统性方法透过系统性,以达到解决疑问或者是知晓系统性方法工作每一次的借此。当然strace与管理学的调试方法取值得肯定gdb之类的是没有人相比较的,因为它不是一个管理学的正则表达式。 strace的最非常简单的名词就是分受命一个均须的指令,在均须的指令完结以后它也就淡出了。在指令分受命的每一次中都,strace但会记录和解析指令发挥作用的所有种系统兄程序以及这个发挥作用所接管到的所有的讯号取值。

root@ubuntu:/usr# strace cat /dev/ execve(, [, ], []) = brk() = access(, F_OK) = - ENOENT (No such file or directory)mmap(NULL, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -, ) = access(, R_OK) = - ENOENT (No such file or directory)...brk() = brk() = fstat(, {st_mode=S_IFCHR|, st_rdev=makedev(, ), ...}) = open(, O_RDONLY) = fstat(, {st_mode=S_IFCHR|, st_rdev=makedev(, ), ...}) = read(, , ) = close() = close() = close() = exit_group() = ?

每偷偷地都是一条种系统兄程序,等号左侧是种系统兄程序的formula_名及其常量,右边是该兄程序的formula_调用。strace 推测这些兄程序的常量并赶回记号形式的取值。strace 从多线程接管个人信息,而且不必需以任何特殊的方式来构建多线程。

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 支配器所有的种系统兄程序.一些兄程序关于default,状况,转换成支配器等兄程序由于运用以频繁,配置明文不支配器. -V 支配器strace的版本个人信息. -x 以十六进制形式支配器的单字符串 -xx 所有字符串以十六进制形式支配器. -a column 设立formula_调用的支配器方位.配置明文 为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= 只搜寻均须的种系统 兄程序.例如:-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= 设应在 strace支配器的种系统兄程序的结果集.-v 等与 abbrev=none.配置明文为abbrev=all. -e raw= 将指 应在的种系统兄程序的常量以十六进制推测. -e signal= 均须搜寻的种系统讯号.配置明文为all.如 signal=!SIGIO(或者signal=!io),透露不搜寻SIGIO讯号. -e read= 支配器从均须明文中都读出 的样本.例如: -e read=, -e write= 支配器加载到均须明文中都的样本. -o filename 将strace的支配器加载明文filename -p pid 搜寻均须的发挥作用pid. -s strsize 均须支配器的字符串的第二大长度.配置明文为32.明文名一直全部支配器. -u username 以username 的UID和GID分受命被搜寻的指令

CE的清晰名词:

strace -o output.txt -T -tt -e trace=all -p 28979

上面的意义是 搜寻28979发挥作用的所有种系统兄程序(-e trace=all),并统计资料种系统兄程序的花掉间隔时间,以及开始间隔时间(并以可视化的时分秒格式推测),最终将记录结果依赖于output.txt明文;还有。

词汇

strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ... [ -ofile ] [-ppid ] ... [ -sstrsize ] [ -uusername ] [ -Evar=val ] ... [ -Evar ]... [ command [ arg ... ] ]

strace -c [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg... ] ]搜寻种系统兄程序

现在我们好好一个很非常简单的机制来演示strace的基本名词。这个机制的C语言比如说如下:

#includeint main(){ int a=0; printf("please input:"); scanf("%d",Browna); printf("%9d",a); return 0;}

从trace本体可以认出,种系统首先兄程序execve开始一个重新透过,接着透过些环境的兄程序操作方法,最终停顿在”read(0,”上面,这也就是分受命到了我们的scanfformula_,等待我们转换成十六进制呢,在转换成完99以后,在兄程序writeformula_将格式化后的数取值" 2″支配器到屏幕,最终兄程序exit_group淡出透过,收尾整个机制的分受命每一次。

搜寻讯号递送至

我们还是运用以上面的那个test机制,来观察发挥作用接管讯号的情形。

种系统兄程序统计资料

strace不光能搜寻种系统兄程序,通过运用以常量-c,它还能将发挥作用所有的种系统兄程序好好一个统计资料系统性给你,示意图就来想到strace的统计资料,这次我们分受命带-c常量的strace:

这里很清楚的得知你兄程序了那些种系统formula_,兄程序至多多少,耗损了多少间隔时间等等这些个人信息,这个对我们系统性一个机制来说是是非常有用的。

书名重定向:

贵州生殖感染医院哪最好
天津白癜风专科医院哪家好
成都看白癜风哪间医院好
成都风湿医院哪里最好
西安看白癜风去哪里
疤痕
口腔修复
传染科
月经有血块
急支糖浆适合哪种咳嗽

上一篇: 同吃他汀5年,朝臣突发脑梗,刘叔却健康无忧,医生指出2点差距

下一篇: 深兰科技获评2021年度人工智能行业领军大企业

友情链接