Hatred's Log Place

DON'T PANIC!

Feb 24, 2009 - 3 minute read - Comments - linux

strace и его аналоги в других *nix (truss, par)

Strace - утилита для трассировки системных вызовов и сигналов. Часто бывает полезна в задаче определения какие файлы открывает программа за время своей работы, например, где ищет конфиги. На этом функционал не ограничивается, подробности можно посмотреть в странице руководства. Есть практически в любом дистрибутиве Linux.

В ArchLinux можно поставить так: pacman -S strace

В Debian-основанных: sudo atp-get install strace

Спользование: strace -o out.log -f programm

вывод получим примерно такой (сохранен в файле out.log)

8506  execve("/usr/bin/mcedit", ["mcedit"], [/* 35 vars */]) = 0
8506  brk(0)                            = 0x9511000
8506  access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
8506  open("/etc/ld.so.cache", O_RDONLY) = 3
8506  fstat64(3, {st_mode=S_IFREG|0644, st_size=149172, ...}) = 0
8506  mmap2(NULL, 149172, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb80b8000
8506  close(3)                          = 0
8506  open("/usr/lib/libgmodule-2.0.so.0", O_RDONLY) = 3
8506  read(3, "<br/>177ELF<br/>1<br/>1<br/>1<br/>0<br/>0<br/>0<br/>0<br/>0<br/>0<br/>0<br/>0<br/>0<br/>3<br/>0<br/>3<br/>0<br/>1<br/>0<br/>0<br/>0@<br/>r<br/>0<br/>0004<br/>0<br/>0<br/>0<br/>354"..., 512) = 512
8506  fstat64(3, {st_mode=S_IFREG|0755, st_size=13057, ...}) = 0
8506  mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb80b7000
8506  mmap2(NULL, 8760, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb80b4000
8506  mmap2(0xb80b6000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2) = 0xb80b6000
8506  close(3)

...

8506  open("/home/hatred/.mc/ini", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 5
8506  fstat64(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
8506  mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb79bd000
8506  write(5, "<br/>n[Midnight-Commander]<br/>nshow_backup"..., 2830) = 2830
8506  close(5)                          = 0
8506  munmap(0xb79bd000, 4096)          = 0
8506  open("/home/hatred/.mc/history", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 5
8506  fstat64(5, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
8506  mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb79bd000
8506  write(5, "<br/>n[inp <br/>320<br/>241<br/>320<br/>276<br/>320<br/>267<br/>320<br/>264<br/>320<br/>260<br/>321<br/>202<br/>321<br/>214 <br/>320<br/>275<br/>320<br/>276<br/>320<br/>262<br/>321<br/>213<br/>320<br/>271 <br/>320
"..., 3031) = 3031
8506  close(5)                          = 0
8506  munmap(0xb79bd000, 4096)          = 0
8506  write(1, "<br/>33[A<br/>33[37m<br/>33[40m<br/>33[K<br/>n<br/>33[K<br/>n<br/>33[K<br/>n<br/>33[K<br/>n<br/>33[K<br/>n"..., 100) = 100
8506  ioctl(4, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon echo ...}) = 0
8506  open("/home/hatred/.mc/Tree.tmp", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 5
8506  fstat64(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
8506  mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb79bd000
8506  write(5, "Midnight Commander TreeStore v 2."..., 35) = 35
8506  close(5)                          = 0
8506  munmap(0xb79bd000, 4096)          = 0
8506  rename("/home/hatred/.mc/Tree.tmp", "/home/hatred/.mc/Tree") = 0
8506  rt_sigprocmask(SIG_BLOCK, [INT QUIT TSTP TTIN TTOU WINCH], [], 8) = 0
8506  write(1, "<br/>33[?1l<br/>33><br/>33[20;1H<br/>33(B<br/>33[m<br/>33[39;49m<br/>r<br/>33[K<br/>r"..., 41) = 41
8506  rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
8506  ioctl(4, SNDCTL_TMR_START or TCSETS, {B38400 opost isig icanon echo ...}) = 0
8506  write(1, "<br/>33[?47l<br/>0338<br/>33[m"..., 11) = 11
8506  rt_sigprocmask(SIG_BLOCK, [INT QUIT TSTP TTIN TTOU WINCH], [], 8) = 0
8506  ioctl(4, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
8506  close(4)                          = 0
8506  rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
8506  write(1, "<br/>33[39;49m"..., 8)      = 8
8506  rt_sigaction(SIGCHLD, {SIG_DFL, [CHLD], SA_RESTART}, {0x807dbd0, [], SA_RESTART}, 8) = 0
8506  write(1, "<br/>n"..., 1)              = 1
8506  select(4, [3], [3], NULL, NULL)   = 1 (out [3])
8506  writev(3, [{"<<br/>0<br/>2<br/>0<br/>0<br/>0<br/>240<br/>4+<br/>0<br/>1<br/>0"..., 12}], 1) = 12
8506  select(4, [3], [], NULL, NULL)    = 1 (in [3])
8506  read(3, "<br/>1<br/>2<br/>t<br/>0<br/>0<br/>0<br/>0<br/>0<br/>6<br/>0`<br/>4<br/>0<br/>0<br/>0<br/>0<br/>4<br/>0<br/>0<br/>0<br/>0<br/>0<br/>0<br/>0@<br/><br/><br/>33<br/>v<br/>0<br/>0<br/>0<br/>0"..., 4096) = 32
8506  read(3, 0x9546ef4, 4096)          = -1 EAGAIN (Resource temporarily unavailable)
8506  close(3)                          = 0
8506  exit_group(0)                     = ?

тут мы запустили mcedit под управлением strace, видим какие файлы отктывала программа, поиграться параметрами - можно увидеть что и как читала/писала. В случае ошибок - после чего зависла или вылетела.

Программы можно запускать под управлением strace, а можно подключаться к уже запущенным, подробности, как выше говорилось: man strace.

Для Solaris подобная программа зовется truss

согласно этой заметки для IRIX подобная программа - par