strace는 리눅스 프로그램 디버깅시 사용 할 수 있는 유용한 툴 중 하나 이다.


strace에 대하여 간략히 살펴 보자.


man 페이지를 살펴 보면 strace의 정의는 다음과 같이 "trace system calls and signals( 시스템 콜과 시그널의 추적)" 되어 있다. 

쉽에 이야기 하면, strace를 이용하여 시스템 콜 함수들이 어떻게 호출 되고 있는지 알 수 있는 명령어 이다.


콘솔 에서 strace 라고 하고 엔터를 입력 하면 다음과 같이 출력 된다. ( 

$ strace

usage: strace [-dffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file]

              [-p pid] ... [-s strsize] [-u username] [-E var=val] ...

              [command [arg ...]]

   or: strace -c -D [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ...

              [command [arg ...]]


 어떤 shared library가 사용되는지 알수 있으며,  어떤 파일을 열다가 실패하는지, 그리고, process가 잠시 멈출때, 어떤것을 대기하고 있는지. 전송되고 들어오는 내용은 무엇인지 , 어떤 signal을 받는지,  ipc 객체들은 어떤것들이 이용되는지 등등에 대한 정보를 파악 할 수 있습니다.

간단히 strace ls 를 수행 시켜 보면 다음과 같이 출력 됩니다.

ls 명령어를 수행 하였을 경우 호출되는 시스템 콜 및 파일 오픈 및 close 그리고 어떤 파일 에 접근 하는지 어떻게 동작 되고 있는지를 파악 할 수 있습니다.


$ strace ls
execve("/bin/ls", ["ls"], [/* 44 vars */]) = 0
brk(0)                                  = 0x8a6a000
uname({sys="Linux", node="jhpark-desktop", ...}) = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb785d000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=98256, ...}) = 0
mmap2(NULL, 98256, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7845000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libselinux.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300>\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=104116, ...}) = 0
mmap2(NULL, 109440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x97e000
mmap2(0x997000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18) = 0x997000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/librt.so.1", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\30\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=30684, ...}) = 0
mmap2(NULL, 33364, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xcc0000
mmap2(0xcc7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6) = 0xcc7000
close(3)                                = 0
... ( 생략 ) ....


strace를 이용하여 자신이 작성한 프로그램을 돌려 보는것도 재미 있을 것이라 생각 되네요..