标题: 自助Linux之strace问题诊断工具 [打印本页] 作者: haidaowang 时间: 2020-3-10 10:15 标题: 自助Linux之strace问题诊断工具 3 D a0 j% f; G( e2 x' e4 z6 b7 J" I
引言 8 r' l2 w$ ~7 w4 ] [' ]* |9 A4 N9 ^+ p
“Oops,系统挂死了..."/ h. g) L q. w$ \
/ C5 Q: L1 s4 I' f, F9 c" D! [* s0 n
“Oops,程序崩溃了..." & f! L. V8 P J7 T! r- B9 I 6 K- T5 l5 P3 x! `( {( e1 i“Oops,命令执行报错..."! D, S& a2 W* J$ G" U
/ C. Y* Q3 N0 c7 T) [6 k. Q$ i% k % ]- M8 `9 q* F# n. ?; P, L
4 H6 O# Y) n, X; l: i) r% W: _; h# H
对于维护人员来说,这样的悲剧每天都在上演。理想情况下,系统或应用程序的错误日志提供了足够全面的信息,通过查看相关日志,维护人员就能很快地定位出问题发生的原因。但现实情况,许多错误日志打印模凌两可,更多地描述了出错时的现象(比如"could not open file","connect to XXX time out"),而非出错的原因。- m; {8 G% C% ?. l" I5 M' h6 y
' O3 i1 B2 m5 u2 t: ]% k8 [2 G2 x 1 U" y c# U( Q: V4 f
5 W9 S3 h2 E4 Z& Y
错误日志不能满足定位问题的需求,我们能从更“深层”的方面着手分析吗?程序或命令的执行,需要通过系统调用(system call)与操作系统产生交互,其实我们可以通过观察这些系统调用及其参数、返回值,界定出错的范围,甚至找出问题出现的根因。 & _. n$ u3 ]1 r$ q$ L- {/ [% i! t0 R# V4 l8 c+ P0 F3 |* I" S6 ^( P
) n9 Q8 r' y; q, k% s: L. c# }& Y: ~+ r
在Linux中,strace就是这样一款工具。通过它,我们可以跟踪程序执行过程中产生的系统调用及接收到的信号,帮助我们分析程序或命令执行中遇到的异常情况。 3 P! B! y! q. j% H/ _, ]9 Q* j 7 t6 l9 s* H( J3 r 1 E5 c! s- S _/ [7 M1 D. K+ W( W
( N/ T3 ~2 \' W; \5 n2 L一个简单的例子 , V4 j; t" e2 W0 V: h: t- z, D; w: n9 n& u
如何使用strace对程序进行跟踪,如何查看相应的输出?下面我们通过一个例子来说明。 7 ^. K5 C2 n/ r) G' X+ G6 r* r! k' j& k0 k
1.被跟踪程序示例 : k: I$ A5 k- v, s, v; ^! k$ m1 q, c' N! ]5 g
//main.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main( )
{
int fd ;
int i = 0 ;
fd = open( “/tmp/foo”, O_RDONLY ) ;
if ( fd < 0 )
i=5;
else
i=2;
return i;
}$ g: f: R* t4 z! @4 E/ @
3 x7 @; j/ |8 d- X4 Z, [
1 }5 V9 h# _. n! C7 r5 F
以上程序尝试以只读的方式打开/tmp/foo文件,然后退出,其中只使用了open这一个系统调用函数。之后我们对该程序进行编译,生成可执行文件: . z! \( E8 y3 O* g; J2 H9 j% M9 W( a, |3 Q; q0 ?! H. S
lx@LX:~$ gcc main.c -o main3 i0 y# Y0 e8 r: t( R/ U1 W+ s. y
$ G8 t8 m$ B! S * |' F1 {- Y3 ?4 p# J2.strace跟踪输出4 V# \/ @, |0 M6 H8 |4 }0 p