Мне понравились некоторые ответы, где написано strace
проверяет, как вы взаимодействуете с вашей операционной системой.
Это именно то, что мы можем видеть. Система звонков. Если вы сравните strace
и ltrace
, разница станет более очевидной.
$>strace -c cd
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 7 read
0.00 0.000000 0 1 write
0.00 0.000000 0 11 close
0.00 0.000000 0 10 fstat
0.00 0.000000 0 17 mmap
0.00 0.000000 0 12 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 8 8 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 getdents
0.00 0.000000 0 2 2 statfs
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 9 openat
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 1 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 93 10 total
С другой стороны, есть ltrace
, который отслеживает функции.
$>ltrace -c cd
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
15.52 0.004946 329 15 memcpy
13.34 0.004249 94 45 __ctype_get_mb_cur_max
12.87 0.004099 2049 2 fclose
12.12 0.003861 83 46 strlen
10.96 0.003491 109 32 __errno_location
10.37 0.003303 117 28 readdir
8.41 0.002679 133 20 strcoll
5.62 0.001791 111 16 __overflow
3.24 0.001032 114 9 fwrite_unlocked
1.26 0.000400 100 4 __freading
1.17 0.000372 41 9 getenv
0.70 0.000222 111 2 fflush
0.67 0.000214 107 2 __fpending
0.64 0.000203 101 2 fileno
0.62 0.000196 196 1 closedir
0.43 0.000138 138 1 setlocale
0.36 0.000114 114 1 _setjmp
0.31 0.000098 98 1 realloc
0.25 0.000080 80 1 bindtextdomain
0.21 0.000068 68 1 opendir
0.19 0.000062 62 1 strrchr
0.18 0.000056 56 1 isatty
0.16 0.000051 51 1 ioctl
0.15 0.000047 47 1 getopt_long
0.14 0.000045 45 1 textdomain
0.13 0.000042 42 1 __cxa_atexit
------ ----------- ----------- --------- --------------------
100.00 0.031859 244 total
Хотя я проверил руководства несколько раз, я не нашел источника имени strace
, но, скорее всего, это трассировка системного вызова, поскольку это очевидно.
Есть три большие заметки о strace
.
Примечание 1. Обе эти функции strace
и ltrace
используют системный вызов ptrace
. Таким образом, ptrace
системный вызов эффективно работает как strace
.
Системный вызов ptrace () предоставляет средство, с помощью которого один процесс (
«трассировщик») может наблюдать и контролировать выполнение другого процесса
(«след»), а также изучить и изменить память следа и
регистры. Он в основном используется для реализации отладки точек останова
и отслеживание системных вызовов.
Примечание 2: С strace
можно использовать различные параметры, поскольку strace
может быть очень многословным. Мне нравится экспериментировать с -c
, который похож на краткое изложение вещей. На основе -c
вы можете выбрать один системный вызов, например -e trace=open
, где вы увидите только этот вызов. Это может быть интересно, если вы изучаете, какие файлы будут открываться во время отслеживания команды.
И, конечно, вы можете использовать grep
для той же цели, но учтите, что вам нужно перенаправить, как этот 2>&1 | grep etc
, чтобы понять, что на файлы конфигурации ссылаются при выполнении команды.
Примечание 3: Я нахожу это очень важное примечание. Вы не ограничены конкретной архитектурой. strace
поразит вас, так как он может отслеживать двоичные файлы различных архитектур.