strace、truss、ltrace 三个调试工具的基本使用方法大体相同,仅介绍三者共有,而且是最常用的三个命令行参数:

-f       :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
-p pid  :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。


实例1:

truss -o ls.truss ls -al: 跟踪ls -al的运行,将输出信息写到文件/tmp/ls.truss中。

实例2:

strace -f -o vim.strace vim: 跟踪vim及其子进程的运行,将输出信息写到文件vim.strace。

实例3:

ltrace -p 234: 跟踪一个pid为234的已经在运行的进程。

brk(0)                                  = 0x8062aa8
brk(0x8063000)                          = 0x8063000
mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x92f) = 0x40016000

实例4:

truss -f -o clint.truss clint

Segmentation fault (core dumped)
# tail clint.truss
  739: read(0x6,0x806f000,0x1000)               = 4096 (0x1000)
  739: fstat(6,0xbfbfe4d0)                       = 0 (0x0)
  739: fcntl(0x6,0x3,0x0)                        = 4 (0x4)
  739: fcntl(0x6,0x4,0x0)                        = 0 (0x0)
  739: close(6)                                    = 0 (0x0)
  739: stat("/root/.clint/plugins",0xbfbfe680)   ERR#2 'No such file or directory'
SIGNAL 11
SIGNAL 11
Process stopped because of:  16
process exit, rval = 139


实例5:

truss -f -D -o vim.truss vim

735: 0.000021511 socket(0x2,0x1,0x0)       = 4 (0x4)
735: 0.000014248 setsockopt(0x4,0x6,0x1,0xbfbfe3c8,0x4) = 0 (0x0)
735: 0.000013688 setsockopt(0x4,0xffff,0x8,0xbfbfe2ec,0x4) = 0 (0x0)
735: 0.000203657 connect(0x4,{ AF_INET 10.57.18.27:6000 },16) ERR#61 'Connection refused'
735: 0.000017042 close(4)          = 0 (0x0)
735: 1.009366553 nanosleep(0xbfbfe468,0xbfbfe460) = 0 (0x0)
735: 0.000019556 socket(0x2,0x1,0x0)       = 4 (0x4)
735: 0.000013409 setsockopt(0x4,0x6,0x1,0xbfbfe3c8,0x4) = 0 (0x0)
735: 0.000013130 setsockopt(0x4,0xffff,0x8,0xbfbfe2ec,0x4) = 0 (0x0)
735: 0.000272102 connect(0x4,{ AF_INET 10.57.18.27:6000 },16) ERR#61 'Connection refused'
735: 0.000015924 close(4)          = 0 (0x0)
735: 1.009338338 nanosleep(0xbfbfe468,0xbfbfe460) = 0 (0x0)

实例6:

# strace -o lsof.strace lsof -p  3125

 

# cd /proc/3125/fd/

# ls -l

total 0

lrwx------    1 root     root           64 Nov  5 09:50 0 -> /dev/pts/0

lrwx------    1 root     root           64 Nov  5 09:50 1 -> /dev/pts/0

lrwx------    1 root     root           64 Nov  5 09:50 2 -> /dev/pts/0

lr-x------    1 root     root           64 Nov  5 09:50 3 -> /tmp/foo

# readlink /proc/3125/fd/3  #readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。

/tmp/foo


strace命令的常用选项:


选项1 寻找被程序读取的配置文件

strace php 2>&1 | grep php.ini

 

选项2 跟踪指定的系统调用


strace命令的-e选项仅仅被用来展示特定的系统调用(例如,open,write等等)

strace -e open cat dead.letter

选项3 跟踪进程

strace -p 1846

选项4 strace的统计概要

它包括系统调用的概要,执行时间,错误等等。使用-c选项能够以一种整洁的方式展示:

strace -c ls

选项5 保存输出结果

strace -o process_strace -p 3229

选项6 显示时间戳

strace -t ls


选项7 更精细的时间戳

strace -ttt ls 


选项8 相对时间

strace -r ls



pstack  3125  #pstack查看到的函数调用堆栈关系


参考:

https://linux.cn/article-3935-1-rel.html

https://linux.cn/article-3823-1-rel.html