더듬이

[리눅스] strace command 본문

Linux

[리눅스] strace command

dbhang 2021. 4. 12. 16:42

 

strace명령어란?

strace 명령어를 찾아보면 시스템 콜,시그널을 추적하는 디버깅 툴이라고한다. 

 

위의 문장을 이해하기 위해서는 먼저 linux의 커널을 알아야한다.

linux 커널에 대한 자세한 설명은 따로 게시하려한다.

 

간단히 말하면 운영체제의는 사용자자 영역, 커널 영역으로 구분되어있는데. 

 

커널은 컴퓨터 자원 (cpu,ram )등 을 관리하는 핵심부분이며 커널영역에 존재한다.

사용자 영역은 

 

 

system calls ? 

이제 우리 사용자가 실행한 프로세스가 하드웨어(cpu, memory, 통신  ,I/O 등등의 많은 자원!)에 접근해야할 때

kernel에 자원 쓰게해주세요! 라고 하는 것들을 system call 이라고 부른다. 

설치

설치는 매우 간단하다. apt-get install strace를 통해 설치할 수 있다. 

apt-get install strace
해보기
root@6af184c5e7e7:/#  strace ls
execve("/bin/ls", ["ls"], [/* 8 vars */]) = 0
brk(NULL)                               = 0x23a0000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=11112, ...}) = 0
mmap(NULL, 11112, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f08ffae7000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260Z\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=130224, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f08ffae6000
mmap(NULL, 2234080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f08ff6a3000
mprotect(0x7f08ff6c2000, 2093056, PROT_NONE) = 0
mmap(0x7f08ff8c1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0x7f08ff8c1000
mmap(0x7f08ff8c3000, 5856, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f08ff8c3000
close(3)
....

위처럼 실행 해보니 어떤 명령어가 실행됐고 ( 명령어의 위치 까지 해서 나온다. )

무엇에 접근했는지

또 mmap() 함수로 memory 를 요청하는 것 까지 볼 수 있다.

 

root@6af184c5e7e7:/# strace -e write ls
write(1, "bin   dev  home  lib64\t\t\t\t      "..., 72bin   dev  home  lib64				      media  opt   root  sbin  sys   tmp  var
) = 72
write(1, "boot  etc  lib\t libc-bin_2.23-0u"..., 87boot  etc  lib	 libc-bin_2.23-0ubuntu11.2_amd64.deb  mnt    proc  run	 srv   test  usr
) = 87
+++ exited with 0 +++

 

이렇게 -e 옵션을 통해 특정 시스템 콜만 추적하는 것도 가능하다.