os/Linux

strace

Jacob_baek 2012. 6. 7. 14:05

strace는?

시스템콜 및 시그널을 추적하는 명령어

프로그램의 문제를 분석하는 디버깅하는 용도로 사용됨.


사용법은 ID 혹은 Command 로 나뉘어 추적할수 있다.

 


usage: strace [-CdffhiqrtttTvVwxxy] [-I n] [-e expr]...
              [-a column] [-o file] [-s strsize] [-P path]...
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]
   or: strace -c[dfw] [-I n] [-e expr]... [-O overhead] [-S sortby]
              -p pid... / [-D] [-E var=val]... [-u username] PROG [ARGS]

사용했던 option은 다음과 같다.

  -f             follow forks
  -o file        send trace output to FILE instead of stderr
  -tt            print absolute timestamp with usecs
  -s strsize     limit length of print strings to STRSIZE chars (default 32)
  -p pid         trace process with process id PID, may be repeated

사용법

다음과 같은 예시를 따라할 수 있다.

참고로 vsftpd를 기존에 설치하여 동작중일때 아래와 같은 pid확인 및 strace사용이 가능하다.


[root@server ~]# ps aux | grep vsftpd  | grep -v "grep" | awk '{print $2}'
[root@server ~]# yum install strace -y
[root@server ~]# strace -f -o /tmp/vsftpd.strace -s 1024 -tt -p 3301


[root@client ~]# ftp 10.10.10.10


[root@server ~]# ## "ctrl + c"

[root@server ~]# vim /tmp/vsftpd.strace

아래와 같이 함수호출과정에 대한 확인이 가능하다.


26937 15:21:23.305953 fstat(3, {st_mode=S_IFREG|0755, st_size=61624, ...}) = 0
26937 15:21:23.306014 mmap(NULL, 2173016, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f30ed439000
26937 15:21:23.306071 mprotect(0x7f30ed445000, 2093056, PROT_NONE) = 0
26937 15:21:23.306128 mmap(0x7f30ed644000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb000) = 0x7f30ed644000
26937 15:21:23.306200 mmap(0x7f30ed646000, 22616, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f30ed646000
26937 15:21:23.306263 close(3)          = 0
26937 15:21:23.306386 mprotect(0x7f30ed644000, 4096, PROT_READ) = 0
26937 15:21:23.306445 munmap(0x7f30f0bc6000, 29570) = 0
26937 15:21:23.306511 open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
26937 15:21:23.306646 fstat(3, {st_mode=S_IFREG|0644, st_size=3236, ...}) = 0
26937 15:21:23.306722 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f30f0bcd000

이를 통해 buffer overflow가 발생시 troubleshooting도 가능하다.


혹 Red Hat Enterprise Linux를 사용하는 경우 debuginfo-install을 통해 symbol을 설치하여 gdb를 통한 trouble shooting도 가능하다.


[root@client ~]# debuginfo-install ftp
[root@client ~]# gdb ftp 10.10.10.10

참고사이트

http://linux.die.net/man/1/strace