GNU/Linux >> Belajar Linux >  >> Linux

7 Contoh Strace untuk Debug Eksekusi Program di Linux

Strace adalah alat debugging yang akan membantu Anda memecahkan masalah.

Strace memonitor panggilan sistem dan sinyal dari program tertentu. Akan sangat membantu bila Anda tidak memiliki kode sumber dan ingin men-debug eksekusi suatu program. strace memberi Anda urutan eksekusi biner dari awal hingga akhir.

Artikel ini menjelaskan 7 contoh strace untuk membantu Anda memulai.

1. Lacak Eksekusi dari yang Dapat Dieksekusi

Anda dapat menggunakan perintah strace untuk melacak eksekusi dari setiap executable. Contoh berikut menunjukkan output dari strace untuk perintah ls Linux.

$  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. Lacak Panggilan Sistem Tertentu dalam Eksekusi Menggunakan Opsi -e

Secara default, strace menampilkan semua panggilan sistem untuk executable yang diberikan. Untuk hanya menampilkan panggilan sistem tertentu, gunakan opsi strace -e seperti yang ditunjukkan di bawah ini.

$ 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

Output di atas hanya menampilkan panggilan sistem terbuka dari perintah ls. Di akhir keluaran strace, ini juga menampilkan keluaran dari perintah ls.

Jika Anda ingin melacak beberapa panggilan sistem, gunakan opsi “-e trace=". Contoh berikut menampilkan panggilan sistem terbuka dan terbaca.

$ 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. Simpan Eksekusi Jejak ke File Menggunakan Opsi -o

Contoh berikut menyimpan output strace ke file 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. Jalankan Strace pada Proses Linux yang Berjalan Menggunakan Opsi -p

Anda dapat menjalankan strace pada program yang sudah berjalan menggunakan id proses. Pertama, identifikasi PID program menggunakan perintah ps.

Misalnya, jika Anda ingin melakukan strace pada program firefox yang sedang berjalan, identifikasi PID dari program firefox tersebut.

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

Gunakan opsi strace -p seperti yang ditunjukkan di bawah ini untuk menampilkan strace untuk id proses yang diberikan.

$  sudo strace -p 1725 -o firefox_trace.txt

$ tail -f firefox_trace.txt

Sekarang jejak eksekusi proses firefox akan masuk ke file teks firefox_trace.txt. Anda dapat mengekor file teks ini untuk menonton jejak langsung dari firefox yang dapat dieksekusi.

Strace akan menampilkan kesalahan berikut ketika id pengguna Anda tidak cocok dengan id pengguna dari proses yang diberikan.

$  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. Cetak Stempel Waktu untuk Setiap Jalur Keluaran Jejak Menggunakan Opsi -t

Untuk mencetak stempel waktu untuk setiap baris keluaran strace, gunakan opsi -t seperti yang ditunjukkan di bawah ini.

$ 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. Cetak Waktu Relatif untuk Panggilan Sistem Menggunakan Opsi -r

Strace juga memiliki opsi untuk mencetak waktu eksekusi untuk setiap panggilan sistem seperti yang ditunjukkan di bawah ini.

$ 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. Hasilkan Laporan Statistik Panggilan Sistem Menggunakan Opsi -c

Menggunakan opsi -c, strace menyediakan laporan statistik yang berguna untuk jejak eksekusi. Kolom "panggilan" pada output berikut menunjukkan berapa kali panggilan sistem tertentu dieksekusi.

$ 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. Temukan Waktu Eksekusi Perintah Atau Proses Di Linux

  2. Contoh Praktis Perintah Unzip di Linux

  3. 5 Contoh Praktis Perintah dd di Linux

  1. Perintah Sed Linux:Penggunaan dan Contoh

  2. Contoh Penting dari Perintah File di Linux

  3. 10 Contoh pidstat untuk Debug Masalah Kinerja Proses Linux

  1. 9 Contoh Perintah Split yang Berguna di Linux

  2. Dapatkan waktu eksekusi program di shell

  3. Eksekusi program yang mungkin berbahaya di Linux