Инструменты пользователя

Инструменты сайта


// 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, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\r\0\0004\0\0\0\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, "\n[Midnight-Commander]\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, "\n[inp \320\241\320\276\320\267\320\264\320\260\321\202\321\214 \320\275\320\276\320\262\321\213\320\271 \320
"..., 3031) = 3031
8506  close(5)                          = 0
8506  munmap(0xb79bd000, 4096)          = 0
8506  write(1, "\33[A\33[37m\33[40m\33[K\n\33[K\n\33[K\n\33[K\n\33[K\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, "\33[?1l\33>\33[20;1H\33(B\33[m\33[39;49m\r\33[K\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, "\33[?47l\0338\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, "\33[39;49m"..., 8)      = 8
8506  rt_sigaction(SIGCHLD, {SIG_DFL, [CHLD], SA_RESTART}, {0x807dbd0, [], SA_RESTART}, 8) = 0
8506  write(1, "\n"..., 1)              = 1
8506  select(4, [3], [3], NULL, NULL)   = 1 (out [3])
8506  writev(3, [{"<\0\2\0\0\0\240\4+\0\1\0"..., 12}], 1) = 12
8506  select(4, [3], [], NULL, NULL)    = 1 (in [3])
8506  read(3, "\1\2\t\0\0\0\0\0\6\0`\4\0\0\0\0\4\0\0\0\0\0\0\0@\\\33\v\0\0\0\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

Комментарии