GNU/Linux >> Tutoriels Linux >  >> Linux

7 exemples Strace pour déboguer l'exécution d'un programme sous Linux

Strace est un outil de débogage qui vous aidera à résoudre les problèmes.

Strace surveille les appels système et les signaux d'un programme spécifique. Il est utile lorsque vous n'avez pas le code source et que vous souhaitez déboguer l'exécution d'un programme. strace vous fournit la séquence d'exécution d'un binaire du début à la fin.

Cet article explique 7 exemples de strace pour vous aider à démarrer.

1. Tracer l'exécution d'un exécutable

Vous pouvez utiliser la commande strace pour tracer l'exécution de n'importe quel exécutable. L'exemple suivant montre la sortie de strace pour la commande Linux ls.

$  strace ls
execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0
brk(0)                                  = 0x8c31000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=65354, ...}) = 0
...
...
...

2. Tracez un appel système spécifique dans un exécutable à l'aide de l'option -e

Par défaut, strace affiche tous les appels système pour l'exécutable donné. Pour afficher uniquement un appel système spécifique, utilisez l'option strace -e comme indiqué ci-dessous.

$ strace -e open ls
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
Desktop  Documents  Downloads  examples.desktop  libflashplayer.so 
Music  Pictures  Public  Templates  Ubuntu_OS  Videos

La sortie ci-dessus affiche uniquement l'appel système ouvert de la commande ls. À la fin de la sortie strace, il affiche également la sortie de la commande ls.

Si vous souhaitez tracer plusieurs appels système, utilisez l'option "-e trace=". L'exemple suivant affiche à la fois les appels système ouverts et lus.

$ strace -e trace=open,read ls /home
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
read(3, "\177ELF\1\1\1\3\3\1\260G004"..., 512) = 512
open("/lib/librt.so.1", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\3\3\1\300\30004"..., 512) = 512
..
open("/lib/libattr.so.1", O_RDONLY)     = 3
read(3, "\177ELF\1\1\1\3\3\1\360\r004"..., 512) = 512
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 315
read(3, "", 1024)                       = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
bala

3. Enregistrez l'exécution de la trace dans un fichier à l'aide de l'option -o

Les exemples suivants stockent la sortie strace dans le fichier output.txt.

$ strace -o output.txt ls
Desktop  Documents  Downloads  examples.desktop  libflashplayer.so
Music  output.txt  Pictures  Public  Templates  Ubuntu_OS  Videos

$ cat output.txt 
execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0
brk(0)                                  = 0x8637000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7860000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0
...
...

4. Exécuter Strace sur un processus Linux en cours d'exécution à l'aide de l'option -p

Vous pouvez exécuter strace sur un programme déjà en cours d'exécution à l'aide de l'ID de processus. Tout d'abord, identifiez le PID d'un programme à l'aide de la commande ps.

Par exemple, si vous souhaitez effectuer un strace sur le programme firefox en cours d'exécution, identifiez le PID du programme firefox.

$ ps -C firefox-bin
  PID TTY          TIME CMD
 1725 ?        00:40:50 firefox-bin

Utilisez l'option strace -p comme indiqué ci-dessous pour afficher le strace pour un identifiant de processus donné.

$  sudo strace -p 1725 -o firefox_trace.txt

$ tail -f firefox_trace.txt

Maintenant, la trace d'exécution du processus firefox sera enregistrée dans le fichier texte firefox_trace.txt. Vous pouvez suivre ce fichier texte pour regarder la trace en direct de l'exécutable firefox.

Strace affichera l'erreur suivante lorsque votre identifiant utilisateur ne correspond pas à l'identifiant utilisateur du processus donné.

$  strace -p 1725 -o output.txt
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

5. Imprimer l'horodatage pour chaque ligne de sortie de trace à l'aide de l'option -t

Pour imprimer l'horodatage pour chaque ligne de sortie strace, utilisez l'option -t comme indiqué ci-dessous.

$ strace -t -e open ls /home
20:42:37 open("/etc/ld.so.cache", O_RDONLY) = 3
20:42:37 open("/lib/libselinux.so.1", O_RDONLY) = 3
20:42:37 open("/lib/librt.so.1", O_RDONLY) = 3
20:42:37 open("/lib/libacl.so.1", O_RDONLY) = 3
20:42:37 open("/lib/libc.so.6", O_RDONLY) = 3
20:42:37 open("/lib/libdl.so.2", O_RDONLY) = 3
20:42:37 open("/lib/libpthread.so.0", O_RDONLY) = 3
20:42:37 open("/lib/libattr.so.1", O_RDONLY) = 3
20:42:37 open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
20:42:37 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
20:42:37 open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
bala

6. Imprimer l'heure relative pour les appels système à l'aide de l'option -r

Strace a également la possibilité d'imprimer le temps d'exécution pour chaque appel système comme indiqué ci-dessous.

$ strace -r ls 
     0.000000 execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0
     0.000846 brk(0)                    = 0x8418000
     0.000143 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
     0.000163 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb787b000
     0.000119 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
     0.000123 open("/etc/ld.so.cache", O_RDONLY) = 3
     0.000099 fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0
     0.000155 mmap2(NULL, 67188, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb786a000
     ...
     ...

7. Générer un rapport statistique des appels système à l'aide de l'option -c

En utilisant l'option -c, strace fournit un rapport statistique utile pour la trace d'exécution. La colonne "appels" dans la sortie suivante indique combien de fois cet appel système particulier a été exécuté.

$ strace -c ls /home
bala
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0         9           read
  -nan    0.000000           0         1           write
  -nan    0.000000           0        11           open
  -nan    0.000000           0        13           close
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         9         9 access
  -nan    0.000000           0         3           brk
  -nan    0.000000           0         2           ioctl
  -nan    0.000000           0         3           munmap
  -nan    0.000000           0         1           uname
  -nan    0.000000           0        11           mprotect
  -nan    0.000000           0         2           rt_sigaction
  -nan    0.000000           0         1           rt_sigprocmask
  -nan    0.000000           0         1           getrlimit
  -nan    0.000000           0        25           mmap2
  -nan    0.000000           0         1           stat64
  -nan    0.000000           0        11           fstat64
  -nan    0.000000           0         2           getdents64
  -nan    0.000000           0         1           fcntl64
  -nan    0.000000           0         2         1 futex
  -nan    0.000000           0         1           set_thread_area
  -nan    0.000000           0         1           set_tid_address
  -nan    0.000000           0         1           statfs64
  -nan    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   114        10 total

Linux
  1. La commande Linux Sed :utilisation et exemples

  2. Trouver le temps d'exécution d'une commande ou d'un processus sous Linux

  3. Exemples essentiels de la commande File sous Linux

  4. 9 exemples utiles de la commande Split sous Linux

  5. Obtenir le temps d'exécution du programme dans le shell

Les 50 exemples pratiques de la commande SED sous Linux

10 exemples utiles de la commande Sort sous Linux

5 exemples pratiques de la commande Read sous Linux

Exemples essentiels de la commande ps sous Linux

5 exemples de la commande Netcat (nc) sous Linux

15 exemples super utiles de la commande Find sous Linux