zoukankan      html  css  js  c++  java
  • linux程序调试命令strace

    strace命令用法详解:

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

    strace常用参数:

    -p	跟踪指定的进程
    -f	跟踪由fork子进程系统调用
    -F	尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪
    -o      filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中
    -ff	常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
    -r	打印每一个系统调用的相对时间
    -t	在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间
    -v	输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出
    -s	指定每一行输出字符串的长度,默认是32。文件名一直全部输出
    -c	统计每种系统调用所执行的时间,调用次数,出错次数。
    -e	expr	输出过滤器,通过表达式,可以过滤出掉你不想要输出
    

    命令实例:

    [root@tomcat02 ~]# strace cat /dev/null 
    execve("/bin/cat", ["cat", "/dev/null"], [/* 26 vars */]) = 0
    brk(0)                                  = 0x24ef000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443faf000
    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=70314, ...}) = 0
    mmap(NULL, 70314, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fb0000
    close(3)                                = 0
    open("/lib64/libc.so.6", O_RDONLY)      = 3
    read(3, "177ELF2113>1360355A2428"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=1979000, ...}) = 0
    mmap(0x38a2400000, 3803304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x38a2400000
    mprotect(0x38a2597000, 2097152, PROT_NONE) = 0
    mmap(0x38a2797000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x197000) = 0x38a2797000
    mmap(0x38a279c000, 18600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x38a279c000
    close(3)                                = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc2000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc3000
    arch_prctl(ARCH_SET_FS, 0x2b8443fc2b20) = 0
    mprotect(0x38a2797000, 16384, PROT_READ) = 0
    mprotect(0x38a1e1f000, 4096, PROT_READ) = 0
    munmap(0x2b8443fb0000, 70314)           = 0
    brk(0)                                  = 0x24ef000
    brk(0x2510000)                          = 0x2510000
    open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=99158704, ...}) = 0
    mmap(NULL, 99158704, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fc4000
    close(3)                                = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    open("/dev/null", O_RDONLY)             = 3
    fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
    read(3, "", 32768)                      = 0
    close(3)                                = 0
    close(1)                                = 0
    close(2)                                = 0
    exit_group(0)                           = ?
    

    每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
    strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。  

    通用的完整用法:

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

    上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。

    2.在umount挂载目录时,直接卡住了,最后用 strace df -Th分析后结果挂载出问题了

    strace df -Th
    

    3.用strace跟踪 whoami的输出:

    strace -o whoami-strace.txt whoami
    

      

    参考文档:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

  • 相关阅读:
    Node的Buffer
    node中定时器的“先进”用法
    比较setImmediate(func),setTimeout(func),process.nextTick(func)
    node.js事件触发
    node.js express的安装过程
    ”靠谱的C#“单例模式
    JS性能消耗在哪里?
    如何建立索引
    优化之sitemap+RSS
    优化のzencart URL &zenid=.....
  • 原文地址:https://www.cnblogs.com/saneri/p/5466519.html
Copyright © 2011-2022 走看看