Debugging with strace / truss / ltrace in Linux
Reference: strace命令详解
进程无法启动,软件运行速度变慢,程序的 "SegmentFault" 等等都是让每个 Unix 系统用户头痛的问题,本文通过演示如何使用 truss, strace, ltrace 这三个常用的调试工具来快速诊断软件的"疑难杂症"。
truss / strace / ltrace 说明
三个调试工具 truss, strace, ltrace 都是使用 ptrace 系统调用跟踪调试运行中的进程,基本使用方式很相似,但用途略有不同:
- truss & strace: 跟踪一个进程的系统调用或信号产生的情况
- ltrace: 跟踪进程调用库函数的情况
命令的使用方式:
<trace|strace|ltrace> <COMMAND>
<trace|strace|ltrace> -p <PID>
常用选项:
- -f, -F 同时跟踪fork和vfork出来的进程
- -o file 结果输出到某个文件
- -e execve 只记录 execve 这类系统调用
- -p PID 追踪指定 PID 对应的进程
- -D 输出前加时间戳
案例
Error message:
$ clint foo.cpp
Segmentation fault (core dumped)
Trace with truss
truss -f clint foo.cpp
Output:
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("/home/foo/.clint/plugins",0xbfbfe680) ERR#2 'No such file or directory'
SIGNAL 11
SIGNAL 11
Process stopped because of: 16
process exit, rval = 139
Solution:
mkdir -p /home/foo/.clint/plugins
WANDERING...