Perintah strace
Perintah strace dapat digunakan untuk mencegat dan merekam panggilan sistem yang dibuat, dan sinyal yang diterima oleh suatu proses. Hal ini memungkinkan pemeriksaan lapisan batas antara pengguna dan ruang kernel yang dapat sangat berguna untuk mengidentifikasi mengapa suatu proses gagal.
Menggunakan strace untuk menganalisis bagaimana program berinteraksi dengan sistem sangat berguna ketika kode sumber tidak tersedia. Selain
pentingnya dalam pemecahan masalah, strace dapat memberikan wawasan mendalam tentang cara sistem beroperasi. Setiap pengguna dapat melacak proses mereka sendiri yang sedang berjalan; selain itu, pengguna root dapat melacak proses yang sedang berjalan. Misalnya, berikut ini dapat digunakan untuk melampirkan dan melacak daemon rsyslogd yang sedang berjalan:
# strace -p $(pgrep rsyslogd) Process 819 attached select(1, NULL, NULL, NULL, {83009, 275934} ...
keluaran strace
Output dari strace akan sesuai dengan panggilan sistem atau sinyal. Keluaran dari panggilan sistem terdiri dari tiga komponen:
1. Panggilan sistem
2. Argumen apa pun yang dikelilingi oleh tanda kurung
3. Hasil panggilan mengikuti tanda sama dengan
Status keluar -1 biasanya menunjukkan kesalahan. Misalnya:
# strace ls file1 execve("/bin/ls", ["ls", "file1"], [/* 21 vars */]) = 0 brk(0) = 0xadb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f516bb79000 ..... close(1) = 0 munmap(0x7f516bb78000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
Kurung kurawal digunakan untuk menunjukkan struktur C dereferensi. Kurung kotak digunakan untuk menunjukkan pointer sederhana atau array nilai.
Contoh perintah strace
Mengalihkan jejak ke file
Karena strace sering membuat output dalam jumlah besar, sering kali lebih mudah untuk mengarahkannya ke file. Misalnya, berikut ini dapat digunakan untuk meluncurkan bash shell, melacak setiap proses turunan bercabang, dan merekam semua akses file ke file files.trace:
# strace -f -o files.trace -e trace=file bash
Menghitung jumlah panggilan sys
Jalankan perintah ls dengan menghitung berapa kali setiap panggilan sistem dilakukan dan cetak total yang menunjukkan jumlah dan waktu yang dihabiskan dalam setiap panggilan (berguna untuk pembuatan profil dasar atau isolasi bottleneck):
# strace -c ls
Melihat file yang dibuka oleh proses/daemon
Contoh berikut menunjukkan tiga file konfigurasi yang dibaca sshd OpenSSH saat dimulai. Perhatikan bahwa strace mengirimkan outputnya ke STDERR secara default, jadi jika Anda ingin menyalurkannya ke perintah lain seperti grep untuk perubahan lebih lanjut, Anda harus mengarahkan output dengan tepat:
# strace -f -eopen /usr/sbin/sshd 2>&1 | grep ssh
Hanya melacak panggilan sistem terkait jaringan
Lacak hanya panggilan sistem terkait jaringan saat Netcat mencoba menyambung ke layanan telnetd lokal:
# strace -e trace=network nc localhost 23
Perintah ltrace
Perintah ltrace dapat digunakan untuk mencegat dan merekam panggilan dinamis yang dilakukan ke pustaka bersama. Jumlah output yang dihasilkan oleh perintah ltrace bisa sangat banyak untuk beberapa perintah (terutama jika opsi -S digunakan untuk juga menampilkan panggilan sistem). Anda dapat memfokuskan output hanya pada interaksi antara program dan beberapa daftar pustaka. Misalnya, untuk menjalankan perintah id -Z dan menampilkan panggilan yang dilakukan ke modul libselinux.so, jalankan:
$ ltrace -l /lib/libselinux.so.1 id -Z is_selinux_enabled(0xc1c7a0, 0x9f291e8, 0xc1affc, 0, -1)a =1 getcon(0x804c2c8, 0xfee80ff4, 0x804b179, 0x804c020, 0)a =0 user_u:system_r:unconfined_t
Ingatlah bahwa Anda dapat melihat pustaka apa yang ditautkan dengan program menggunakan perintah ldd.