精华内容
下载资源
问答
  • strace命令详解
    2021-03-12 14:39:25

    语法

    strace [ -dDffhiqrtttTvVxx ] [ -a column ] [ -e expr ] ... [ -o file ] [ -p pid ] ... [ -s strsize ] [ -u username ] [ -E var=val ] ... [ -E var ] ... [ command [ arg ... ] ]
    
    strace -c [ -D ] [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg ... ] ]
    

    说明

    在最简单的情况下,strace运行指定的命令,直到它退出。它拦截并记录进程调用的系统调用和进程接收到的信号。每个系统调用的名称、参数及其返回值都打印在标准错误或用-o选项指定的文件中。

    strace是一个有用的诊断、指导和调试工具。系统管理员、诊断人员和故障排除人员将发现,它对于解决源代码不易获得的程序的问题是非常宝贵的,因为它们不需要为了跟踪而重新编译。学生、黑客和过于好奇的人会发现,通过追踪甚至是普通的程序,可以了解到很多关于系统及其系统调用的信息。程序员会发现,由于系统调用和信号都是发生在用户/内核界面上的事件,因此仔细检查这个边界对于错误隔离、健全性检查和试图捕获竞争条件非常有用。

    跟踪中的每一行都包含系统调用名,以及包含在括号中的参数及其返回值。对命令cat /dev/null进行扫描的示例如下:

    open("/dev/null", O_RDONLY) = 3
    

    错误(通常返回值为-1)附加了errno符号和错误字符串:

    open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
    

    信号被打印成信号符号和信号串。“sleep 666”命令的扫描和中断摘录如下:

    sigsuspend([] <unfinished ...>
    --- SIGINT (Interrupt) ---
    +++ killed by SIGINT +++
    

    如果一个系统调用正在执行,而另一个系统调用正在从不同的线程/进程调用,那么strace将尝试保持这些事件的顺序,并将正在进行的调用标记为未完成。当呼叫返回时,它将被标记为已恢复:

    [pid 28772] select(4, [3], NULL, NULL, NULL <unfinished ...>
    [pid 28779] clock_gettime(CLOCK_REALTIME, {1130322148, 939977000}) = 0
    [pid 28772] <... select resumed> )      = 1 (in [3])
    

    参考:
    https://linux.die.net/man/1/strace

    更多相关内容
  • strace常用来跟踪进程执行时的系统调用和所接收的信号。下面通过本文给大家分享Linux应用调试之strace命令,需要的朋友参考下吧
  • strace命令详解

    2020-06-09 17:27:34
    strace是一个非常简单的工具,它可以跟踪系统调用的执行。最简单的方式,它可以从头到尾跟踪binary的执行,然后以一行文本输出系统调用的名字,参数和返回值。 其实它可以做的更多: 可以对特定的系统调用或者几组...

    ps:

    strace是一个非常简单的工具,它可以跟踪系统调用的执行。最简单的方式,它可以从头到尾跟踪binary的执行,然后以一行文本输出系统调用的名字,参数和返回值。

    其实它可以做的更多:

    • 可以对特定的系统调用或者几组系统调用进行过滤
    • 可以通过统计特定系统调用的调用次数、耗费的时间、成功和失败的次数来配置(profile)系统调用的使用I
    • 跟踪发送给进程的信号量
    • 可以通过pid附着(attach)到任何运行的进程 

    使用场景: 

    1)找出应用程序在启动时读取的是哪个配置文件
    strace /usr/local/php/bin/php 2>&1 | grep php.ini

    只关心特定的系统调用,-e 参数指定

    strace -e open /usr/local/php/bin/php 2>&1 | grep php.ini

    2)为什么某个进程没有打开本来该打开的文件

    strace -e open,access -p `ps aux | grep nginx | grep -v grep | grep master | awk '{print $2}'`
    3)某个进程正在干啥事,某个进程卡住了?

    strace -p `ps aux | grep nginx | grep -v grep | grep worker | awk '{print $2}' | head -n 1`


     

     

     

    可用参数:

    -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= 
    只跟踪指定的系统 调用.例如:-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执行被跟踪的命令
    展开全文
  • strace 命令详解

    千次阅读 2022-02-16 13:50:34
    一、strace 是什么? 按照 strace 官网的描述,strace 是一个可用于诊断、调试和教学的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。 strace 底层...

    一、strace 是什么?

    按照 strace 官网的描述,strace 是一个可用于诊断、调试和教学的 Linux 用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。

    strace 底层使用内核的 ptrace 特性来实现其功能。

    在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace 作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。

    二、strace 能做什么?

    运维工程师都是实践派的人,我们还是先来个例子吧。

    我们从别的机器 copy 了个叫做 some_server 的软件包过来,开发说直接启动就行,啥都不用改。可是尝试启动时却报错,根本起不来!

    启动命令:

    ./some_server ../conf/some_server.conf

    输出: 

    FATAL: InitLogFile failed iRet: -1!
    Init error: -1655

    为什么起不来呢?从日志看,似乎是初始化日志文件失败,真相到底怎样呢?我们用 strace 来看看。 

    strace -tt -f  ./some_server ../conf/some_server.conf

    我们注意到,在输出 InitLogFile failed 错误的前一行,有个 open 系统调用: 

    23:14:24.448034 open("/usr/local/apps/some_server/log//server_agent.log", O_RDWR|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = -1 ENOENT (No such file or directory)

    它尝试打开文件 /usr/local/apps/some_server/log//server_agent.log 来写(不存在则创建),可是却出错了,返回码是 -1 , 系统错误号 errorno 为 ENOENT。 查下 open 系统调用的手册页:

    man 2 open

    搜索 ENOENT 这个错误号 errno 的解释

    ENOENT O_CREAT  is not set and the named file does not exist.  Or, a directory component in pathname does not exist or is a dangling symbolic link.

    这里说得比较清楚,因为我们例子中的 open 选项指定了 O_CREAT 选项,这里 errno 为 ENOENT 的原因是日志路径中某个部分不存在或者是一个失效的符号链接。我们来一级一级看下路径中的哪部分不存在:

     

    ls -l /usr/local/apps/some_server/log
    ls: cannot access /usr/local/apps/some_server/log: No such file or directory
    ls -l /usr/local/apps/some_server
    total 8
    drwxr-xr-x 2 root users 4096 May 14 23:13 bin
    drwxr-xr-x 2 root users 4096 May 14 22:48 conf

    原来是 log 子目录不存在!上层目录都是存在的。手工创建 log 子目录后,服务就能正常启动了。

    回过头来, strace 究竟能做什么呢?

    它能够打开应用进程的这个黑盒,通过系统调用的线索,告诉你进程大概在干嘛。

    三、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:对于某些相关调用,把完整的环境变量,文件 stat 结构等打出来。
    • -f:跟踪目标进程,以及目标进程创建的所有子进程
    • -e:控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
    • -o:把 strace 的输出单独写到指定的文件
    • -s:当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是 32 个字节
    • -p:指定要跟踪的进程 pid,要同时跟踪多个 pid,重复多次 -p 选项即可。

    四、strace问题定位案例

    1、定位进程异常退出

    问题:机器上有个叫做run.sh的常驻脚本,运行一分钟后会死掉。需要查出死因。

    定位:进程还在运行时,通过ps命令获取其pid, 假设我们得到的pid是24298

    strace -o strace.log -tt -p 24298

     查看 strace.log,我们在最后 2 行看到如下内容:

    22:47:42.803937 wait4(-1,  <unfinished ...>
    22:47:43.228422 +++ killed by SIGKILL +++

    这里可以看出,进程是被其他进程用 KILL 信号杀死的。

    实际上,通过分析,我们发现机器上别的服务有个监控脚本,它监控一个也叫做 run.sh 的进程,当发现 run.sh 进程数大于 2 时,就会把它杀死重启。结果导致我们这个 run.sh 脚本被误杀。

    进程被杀退出时,strace 会输出 killed by SIGX(SIGX 代表发送给进程的信号)等,那么,进程自己退出时会输出什么呢?

    这里有个叫做 test_exit 的程序,其代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    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 */]) = 0
    23:07:24.674665 arch_prctl(ARCH_SET_FS, 0x7f1c0eca7740) = 0
    23:07:24.675108 exit_group(1)           = ?
    23:07:24.675259 +++ exited with 1 +++

    可以看出,进程自己退出时(调用 exit 函数,或者从 main 函数返回), 最终调用的是 exit_group 系统调用, 并且 strace 会输出 exited with X(X为退出码)。

    可能有人会疑惑,代码里面明明调用的是 exit,怎么显示为 exit_group?

    这是因为这里的 exit 函数不是系统调用,而是 glibc 库提供的一个函数,exit 函数的调用最终会转化为 exit_group 系统调用,它会退出当前进程的所有线程。实际上,有一个叫做 _exit()的系统调用(注意 exit 前面的下划线),线程退出时最终会调用它。

    2、定位共享内存异常

    有个服务启动时报错:

    shmget 267264 30097568: Invalid argument
    Can 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) = 0
    22:46:36.351939 shmat(0, 0, 0)          = ?
    Process 21406 attached
    22:46:36.355439 shmget(0x41400, 30097568, 0666) = -1 EINVAL (Invalid argument)
    shmget 267264 30097568: Invalid argument
    Can not get shm...exit!

    这里,我们通过 -e trace=ipc 选项,让 strace 只跟踪和进程通信相关的系统调用。

    从 strace 输出,我们知道是 shmget 系统调用出错了,errno 是 EINVAL。同样, 查询下 shmget 手册页,搜索 EINVAL 的错误码的说明:

     EINVAL A new segment was to be created and size < SHMMIN or 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 41400
    key        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 代码)。这里提供两个Shell 脚本实现:

    poor_script.sh:

    !/bin/bash
    total_line=0
    while read filename; do
       line=$(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命令详解 - 马昌伟 - 博客园

    (SAW:Game Over!)

    展开全文
  • 1)使用场景: strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取...用法很简单,在原本的命令前加上strace即可。比如我们要跟踪 "ls -l

    1)使用场景:

    strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

    2)strace 运行模式

    strace有两种运行模式。

    <1>一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可。比如我们要跟踪 "ls -lh /var/log/messages" 这个命令的执行,可以这样:
    
    strace ls -lh /var/log/messages
    
    <2>另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。 这种情况,给strace传递个-p pid 选项即可。比如,有个在运行的some_server服务,第一步,查看pid:
    
    pidof some_server                      
    17553
    得到其pid 17553然后就可以用strace跟踪其执行:
    strace -p 17553
    完成跟踪时,按ctrl + C 结束strace即可。
    

    3)命令使用:

    各个参数说明:

    -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执行被跟踪的命令
    

    4)举例:

    1.strace xxx(某命令或者程序) – 执行名称为 xxx 的命令或程序并追踪系统调用
    在这里插入图片描述

    2.strace -p procid – 跟踪ID为procid的进程系统调用情况

    3.strace -c -p procid – 统计ID为的procid的进程系统调用次数与用时,按CTRL+C结束统计,执行结果如下:
    在这里插入图片描述

    4.strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p xxx – 跟踪进程ID为 xxx 在启动时都访问了哪些文件,显示毫秒级别的时间,并显示每次系统调用花费的时间,对于某些相关调用,把完整的环境变量,文件stat结构等都打印出来,跟踪目标进程及其创建的所有子进程,把输出单独写到指定文件strace.log 中,输出指定长度为1024。

    -tt 在每行输出的前面,显示毫秒级别的时间
    -T 显示每次系统调用所花费的时间
    -v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
    -f 跟踪目标进程,以及目标进程创建的所有子进程
    -e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
    -o 把strace的输出单独写到指定的文件
    -s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
    -p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
    

    在这里插入图片描述

    展开全文
  • strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息。可谓是 linux 下的调试利器,不仅可以用来找程序错误,系统为什么挂死了,命令为什么报错,还可以用来查找哪些...
  • Linux抓取TCP的命令: tcpdumpps -ef 参数命令详解: Linux下一切皆文件,我们打开一个socket,实际上也是打开了一个文件我们打开一个网卡,实际上也是调用Linux系统的网卡接口Linux下有一个文件列表,用来监控当前...
  • strace命令详解 - 马昌伟 - 博客园 按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,570
精华内容 628
关键字:

strace命令详解

友情链接: 0904.rar