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