zoukankan      html  css  js  c++  java
  • 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相关的系统调用

    -e trace=file :      只记录涉及到文件名的系统调用
     
    -e trace=desc :      只记录涉及到文件句柄的系统调用  还有其他的包括process,ipc,signal等。

    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, "177ELF21133>10003561"..., 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
    17:10:07 execve("/usr/bin/ls", ["ls"], [/* 26 vars */]) = 0
    17:10:07 brk(NULL)                      = 0x154b000
    17:10:07 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f33240bf000
    17:10:07 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    17:10:07 open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    17:10:07 fstat(3, {st_mode=S_IFREG|0644, st_size=42272, ...}) = 0
    17:10:07 mmap(NULL, 42272, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f33240b4000
    17:10:07 close(3)                       = 0
    17:10:07 open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
    17:10:07 read(3, "177ELF2113>1300j"..., 832) = 832
    17:10:07 fstat(3, {st_mode=S_IFREG|0755, st_size=155744, ...}) = 0
    17:10:07 mmap(NULL, 2255216, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f3323c78000
    17:10:07 mprotect(0x7f3323c9c000, 2093056, PROT_NONE) = 0
    17:10:07 mmap(0x7f3323e9b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7f3323e9b000
    17:10:07 mmap(0x7f3323e9d000, 6512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f3323e9d000
    17:10:07 close(3)                       = 0
  • 相关阅读:
    功能:Java多线程
    ORACLE Procedure 存储过程语法
    oracle存储过程 学习笔记
    浅讲.Net 6之ConfigurationManager
    浅讲.Net 6 之 WebApplicationBuilder
    [译] LINQ Enhancements in Entity Framework Core 6 上
    浅讲.Net 6 并与之前版本写法对比
    [译] LINQ Enhancements in Entity Framework Core 6 下
    [译] Seven System.Text.Json features in the .NET 6
    浅讲EF高级用法之自定义函数
  • 原文地址:https://www.cnblogs.com/Template/p/9122076.html
Copyright © 2011-2022 走看看