strace¸¦ ÀÌ¿ëÇÑ system call tracing
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

strace

¸®´ª½º»ó¿¡¼­ ÀÛµ¿ÇÏ´Â C ÄÚµåµéÀº ¸ðµÎ ½Ã½ºÅÛÄÝÀ» ÁÖ¾îÁø ÀÓ¹«¸¦ ¼öÇàÇÑ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¥ÀÇ ½Ã½ºÅÛÄÝÀÌ È£ÃâµÇ´Â °ÍÀ» ÃßÀûÇÒ ¼ö ÀÖ´Ù¸é, ÇÁ·Î±×·¥À» µð¹ö±ëÇϰųª Á¦´ë·Î ÀÛµ¿µÇ´ÂÁö¿¡ ´ëÇÑ Áß¿äÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

strace¶õ ¹«¾ùÀΰ¡ ?

strace´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉµ¿¾È È£ÃâÇÏ´Â ½Ã½ºÅÛÄÝÀ» ÃßÀûÇÒ ¼ö ÀÖ´Â Åø ÀÌ´Ù. ¿©±â¿¡ ´õºÒ¾î ÇÁ·Î¼¼½º°¡ ¹ÞÀº signal¿¡ ´ëÇÑ Á¤º¸µµ ¾òÀ» ¼ö ÀÖ´Ù. strace¸¦ ÀÌ¿ëÇÏ´Â °¡Àå °£´ÜÇÑ °æ¿ì´Â 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 [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ... 
              [command [arg ...]] 
 

½Ã½ºÅÛÄÝ ÃßÀûÇϱâ

strace¸¦ Å×½ºÆ®Çϱâ À§Çؼ­ °£´ÜÇÑ ¼ÀÇÃÇÁ·Î±×·¥À» ¸¸µé¾îº¸µµ·Ï ÇÏÀÚ. ÇÁ·Î±×·¥ÀÇ À̸§Àº test.c ·Î ÇϰڴÙ.
#include <stdio.h> 
 
int main(int argc, char **argv) 
{ 
  return 0; 
} 
 

ÀÌÁ¦ ÇÁ·Î±×·¥À» ÄÄÆÄÇÑÈÄ, strace¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù.
$ strace ./mytest2  
execve("./mytest2", ["./mytest2"], [/* 47 vars */]) = 0 
brk(0)                                  = 0x804a000 
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) = 0xb7f9c000 
close(3)                                = 0 
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory) 
open("/lib/tls/i686/cmov/libc.so.6", 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\260a\1"..., 512) = 512 
.... 
.... 
fstat64(3, {st_mode=S_IFREG|0644, st_size=1339816, ...}) = 0 
mmap2(NULL, 1349136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e3c000 
mmap2(0xb7f83000, 9744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f83000 
close(3)                                = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e3b000 
mprotect(0xb7f80000, 4096, PROT_READ)   = 0 
munmap(0xb7f86000, 89519)               = 0 
exit_group(0)                           = ? 
Process 22425 detached 
 

strace¸¦ ½ÇÇà½ÃŰ¸é °¡Àå ¸ÕÀú, ÀÎÀÚ·Î ÁÖ¾îÁø ÇÁ·Î±×·¥À» execv ¸¦ ÀÌ¿ëÇØ¼­ ½ÇÇà½ÃŲ´Ù. ¿©±â¿¡¼­, ÀÎÀÚ´Â ./mytest2¸¦ Áá°í, 47°³ÀÇ È¯°æº¯¼ö¸¦ ³Ñ°åÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌ È¯°æº¯¼ö´Â strace¸¦ ½ÇÇà½ÃŲ, shell¿¡¼­ º¹»çµÈ °ªµéÀÌ´Ù.
execve("./mytest2", ["./mytest2"], [/* 47 vars */]) = 0 
 
ÀÌÁ¦ brk(0), close(2), open(2), read(2)¿Í °°Àº ½Ã½ºÅÛÇÔ¼öµéÀ» È£ÃâÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÃÖÁ¾ÀûÀ¸·Î exit_group ¸¦ È£ÃâÇØ¼­ ÇÁ·Î¼¼½º¸¦ Á¾·á½Ã۰í, ½©·Î detached µÈ´Ù.

½Ã±×³Î ÃßÀû¹× º¸°í¼­¸¸µé±â

strace¸¦ ÀÌ¿ëÇÏ¸é ½Ã±×³ÎÀ» ÃßÀûÇϰí, ÀÌ¿¡ ´ëÇÑ º¸°í¼­¸¦ ¸¸µé ¼öµµ ÀÖ´Ù. ´ÙÀ½°ú °°Àº CÄڵ带 ÁغñÇÏÀÚ.
#include <stdio.h> 
 
int main() 
{ 
  int i; 
  for(i=0;i>=0;i++) 
  { 
    printf("infinity\n"); 
  } 
  return 0; 
} 
 

´ÙÀ½°ú °°ÀÌ strace¸¦ »ç¿ëÇØº¸ÀÚ.
$ strace -o trace.txt ./mytest3 
 
ÀÌÁ¦ Àû´çÇÑ ½Ã±â¿¡ ctrl+c ¸¦ ´­·¯½º SIGINT signalÀ» ¹ß»ý½ÃŲ´Ù. strace¸¦ ÀÌ¿ëÇÑ ¸ðµç °á°ú´Â trace.txt¿¡ ÀúÀåµÇ¾î ÀÖÀ¸´Ï È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
... 
... 
write(1, "infinity\n", 9)               = 9 
write(1, "infinity\n", 9)               = 9 
write(1, "infinity\n", 9)               = 9 
write(1, "infinity\n", 9)               = 9 
write(1, "infinity\n", 9)               = 9 
write(1, "infinity\n", 9)               = 9 
--- SIGINT (Interrupt) @ 0 (0) --- 
+++ killed by SIGINT +++ 
 
SIGINT ½Ã±×³ÎÀ» ¹Þ°í, ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¾úÀ½À» ¾Ë ¼ö ÀÖ´Ù.

½Ã½ºÅÛÄÝ Åë°è

¶ÇÇÑ -c ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ ½Ã½ºÅÛÄÝ¿¡ ´ëÇÑ Åë°è¸¦ ³¾ ¼öµµ ÀÖ´Ù.
$ strace -o trace.txt -c ./mytest3 
$ cat trace.txt 
% time     seconds  usecs/call     calls    errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
100.00    0.000472           0     35067         1 write 
  0.00    0.000000           0         1           read 
  0.00    0.000000           0        18        16 open 
  0.00    0.000000           0         2           close 
  0.00    0.000000           0         1           execve 
  0.00    0.000000           0         3         3 access 
  0.00    0.000000           0         1           brk 
  0.00    0.000000           0         1           munmap 
  0.00    0.000000           0         1           mprotect 
  0.00    0.000000           0         7           mmap2 
  0.00    0.000000           0        16        15 stat64 
  0.00    0.000000           0         3           fstat64 
  0.00    0.000000           0         1           set_thread_area 
------ ----------- ----------- --------- --------- ---------------- 
100.00    0.000472                 35122        35 total 
 

½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½º ÃßÀûÇϱâ

-p ¿É¼ÇÀ¸·Î ½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½º¸¦ ÃßÀûÇÒ ¼ö ÀÖ´Ù.
# strace -p [pid] 
 
fork(2)¿Í vfork(2)µµ ÃßÀûÇÏ·Á¸é f¿Í F¿É¼ÇÀ» »ç¿ëÇÏ¸é µÈ´Ù.
# strace -fF -p [pid] 
 

½ÇÇà ÁßÀÎ µ¥¸ó ÇÁ·Î¼¼½ºÀÇ »óŸ¦ È®ÀÎÇϱâ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
  1. µ¥¸óÀÌ ¸ØÃè´Ù. ¾î´À ÁöÁ¡¿¡¼­ ¸ØÃè´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ´Ù.
  2. Ŭ¶óÀÌ¾ðÆ®°¡ ¿¬°áÀ» ÇÏÁö ¸øÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â connect(2)ÇÔ¼ö¸¦ È£ÃâÇß´ÂÁö, ¼­¹ö´Â accept(2)ÇÔ¼ö°¡ Á¦´ë·Î È£Ã⠵Ǿú´ÂÁö È®ÀÎÇÒ ¼ö ÀÖ´Ù.

¸¶Ä¡¸ç

gdb, ltrace, strace¸¦ ÇÔ²² »ç¿ëÇÑ´Ù¸é, Á»´õ ½±°Ô ÇÁ·Î±×·¥ÀÇ ¼º´É°ú ¹®Á¦Á¡µîÀ» ÆÄ¾ÇÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.