Cara Menggunakan strace untuk Memantau Panggilan Sistem Linux

Diterbitkan: 2022-01-29
Jendela terminal bergaya pada PC laptop.
fatmawati achmad zaenuri/Shutterstock.com

Program Linux meminta kernel untuk melakukan beberapa hal untuk mereka. Perintah strace mengungkapkan panggilan sistem ini. Anda dapat menggunakannya untuk memahami cara kerja program dan mengapa, terkadang, tidak.

Kernel dan Panggilan Sistem

Secerdas mereka, program komputer tidak dapat melakukan semuanya sendiri. Mereka perlu membuat permintaan agar fungsi tertentu dilakukan untuk mereka. Permintaan ini masuk ke kernel Linux. Biasanya, ada perpustakaan atau antarmuka perangkat lunak lain yang dipanggil oleh program, dan perpustakaan kemudian membuat permintaan yang sesuai—disebut panggilan sistem—ke kernel.

Mampu melihat panggilan sistem yang dibuat oleh suatu program dan apa tanggapannya dapat membantu Anda memahami cara kerja program yang menarik minat Anda atau yang telah Anda tulis. Inilah yang dilakukan strace . Ini dapat membantu memecahkan masalah dan mencari kemacetan.

Ini tidak sama dengan men-debug aplikasi dengan alat seperti gdb . Program debugging memungkinkan Anda menyelidiki operasi internal program saat dijalankan. Ini memungkinkan Anda menelusuri logika program Anda dan memeriksa memori dan nilai variabel. Sebagai perbandingan, apa yang dilakukan strace adalah menangkap informasi panggilan sistem saat program sedang berjalan. Ketika program yang dilacak berakhir, strace mencantumkan informasi panggilan sistem ke jendela terminal.

Panggilan sistem menyediakan segala macam fungsionalitas tingkat rendah, seperti tindakan membaca dan menulis pada file, mematikan proses, dan sebagainya. Ada daftar ratusan panggilan sistem di halaman manual syscalls.

TERKAIT: Debugging dengan GDB: Memulai

Menginstal strace

Jika strace belum terinstal di komputer Anda, Anda dapat menginstalnya dengan sangat mudah.

Di Ubuntu, gunakan perintah ini:

 sudo apt install strace 

Di Fedora, ketik perintah ini:

 sudo dnf install strace 

Di Manjaro, perintahnya adalah:

 sudo pacman -Sy strace 

Langkah pertama dengan strace

Kami akan menggunakan program kecil untuk mendemonstrasikan strace . Itu tidak banyak membantu: Ini membuka file dan menulis sebaris teks ke dalamnya, dan tidak ada kesalahan saat memeriksanya. Ini hanya peretasan cepat sehingga kami memiliki sesuatu untuk digunakan dengan strace .

 #sertakan <stdio.h>

int main(int argc, char argv[]) { 

  // pegangan file 
  FILE *fileGeek;

  // buka file bernama "strace_demo.txt", atau buat 
  fileGeek = fopen("strace_demo.txt", "w");

  // tulis beberapa teks ke file 
  fprintf(fileGeek, "Tulis ini ke file");

  // tutup file 
  fclose(fileGeek);

  //keluar dari program 
  kembali (0); 

} // akhir dari main

Kami menyimpan ini ke dalam file bernama "file-io.c" dan mengompilasinya dengan gcc menjadi executable bernama stex , dinamai " st race ex ample."

 gcc -o stex file-io.c

Kami akan memanggil strace dari baris perintah dan meneruskan nama executable baru kami sebagai proses yang ingin kami lacak. Kami dapat dengan mudah melacak perintah Linux atau executable biner lainnya. Kami menggunakan program kecil kami karena dua alasan.

Alasan pertama adalah bahwa strace bertele-tele. Outputnya bisa banyak. Itu bagus ketika Anda menggunakan strace dalam kemarahan, tetapi pada awalnya bisa sangat berlebihan. Ada keluaran strace terbatas untuk program kecil kami. Alasan kedua adalah bahwa program kami memiliki fungsionalitas yang terbatas, dan kode sumbernya pendek dan lugas. Ini membuatnya lebih mudah untuk mengidentifikasi bagian mana dari output yang merujuk ke bagian yang berbeda dari cara kerja internal program.

 strace ./stex 

Kita dapat dengan jelas melihat panggilan sistem write mengirim teks "Tulis ini ke file" ke file yang dibuka dan panggilan sistem exit_group . Ini mengakhiri semua utas dalam aplikasi dan mengirimkan nilai pengembalian kembali ke shell.

Memfilter Keluaran

Bahkan dengan program demonstrasi sederhana kami, ada cukup banyak output. Kita dapat menggunakan opsi -e (ekspresi). Kami akan memberikan nama panggilan sistem yang ingin kami lihat.

 strace -e tulis ./stex 

Iklan

Anda dapat melaporkan beberapa panggilan sistem dengan menambahkannya sebagai daftar yang dipisahkan koma. Jangan sertakan spasi putih apa pun dalam daftar panggilan sistem.

 strace -e tutup, tulis ./stex 

Mengirim Output ke File

Manfaat menyaring output juga masalah dengan menyaring output. Anda melihat apa yang Anda minta untuk dilihat, tetapi Anda tidak melihat yang lain. Dan beberapa dari keluaran lain itu mungkin lebih berguna bagi Anda daripada hal-hal yang Anda minta untuk dilihat.

Terkadang, lebih mudah untuk menangkap semuanya dan mencari serta menggulir seluruh rangkaian hasil. Dengan begitu, Anda tidak akan secara tidak sengaja mengecualikan sesuatu yang penting. Opsi -o (output) memungkinkan Anda mengirim output dari sesi strace ke file teks.

 strace -o trace-output.txt ./stex 

Anda kemudian dapat menggunakan perintah less untuk menggulir daftar dan mencari panggilan sistem—atau apa pun—berdasarkan nama.

 lebih sedikit trace-output.txt 

Anda sekarang dapat menggunakan semua kemampuan pencarian less untuk menyelidiki keluaran.

TERKAIT: Cara Menggunakan Lebih Sedikit Perintah di Linux

Menambahkan Stempel Waktu

Anda dapat menambahkan beberapa stempel waktu yang berbeda ke output. Opsi -r (stempel waktu relatif) menambahkan stempel waktu yang menunjukkan perbedaan waktu antara awal setiap panggilan sistem yang berurutan. Perhatikan bahwa nilai waktu ini akan mencakup waktu yang dihabiskan dalam panggilan sistem sebelumnya dan apa pun yang dilakukan program sebelum panggilan sistem berikutnya.

 strace -r ./stex 

Iklan

Stempel waktu ditampilkan di awal setiap baris keluaran.

Untuk melihat jumlah waktu yang dihabiskan di setiap panggilan sistem, gunakan opsi -T (waktu panggilan sys). Ini menunjukkan durasi waktu yang dihabiskan di dalam setiap panggilan sistem.

 strace -T ./stex 

Durasi waktu ditampilkan di akhir setiap saluran panggilan sistem.

Untuk melihat waktu saat setiap panggilan sistem dipanggil, gunakan opsi -tt (cap waktu absolut). Ini menunjukkan waktu "jam dinding", dengan resolusi mikrodetik.

 strace -tt ./stex 

Waktu ditampilkan di awal setiap baris.

Menelusuri Proses yang Berjalan

Jika proses yang ingin Anda lacak sudah berjalan, Anda masih bisa melampirkan strace padanya. Untuk melakukannya, Anda perlu mengetahui ID proses. Anda dapat menggunakan ps dengan grep untuk menemukan ini. Kami menjalankan Firefox. Untuk mengetahui ID proses firefox kita bisa menggunakan ps dan pipe melalui grep .

 ps -e | grep firefox 

Iklan

Kita dapat melihat bahwa ID proses adalah 8483. Kita akan menggunakan opsi -p (ID proses) untuk memberi tahu strace proses mana yang harus dilampirkan. Perhatikan bahwa Anda harus menggunakan sudo :

 sudo strace -p 8483 

Anda akan melihat pemberitahuan bahwa strace telah melekat pada proses, dan kemudian panggilan pelacakan sistem akan ditampilkan di jendela terminal seperti biasa.

Membuat Laporan

Opsi -c (hanya ringkasan) menyebabkan strace mencetak laporan. Ini menghasilkan tabel untuk informasi tentang panggilan sistem yang dibuat oleh program yang dilacak.

 strace -c ./stex 

Kolom-kolom tersebut adalah:

  • % time : Persentase waktu eksekusi yang dihabiskan di setiap panggilan sistem.
  • detik : Total waktu yang dinyatakan dalam detik dan mikrodetik yang dihabiskan di setiap panggilan sistem.
  • usecs/call : Waktu rata-rata dalam mikrodetik yang dihabiskan di setiap panggilan sistem.
  • panggilan : Berapa kali setiap panggilan sistem dieksekusi.
  • error : Jumlah kegagalan untuk setiap panggilan sistem.
  • syscall : Nama panggilan sistem.

Nilai-nilai ini akan menunjukkan nol untuk program sepele yang dijalankan dan dihentikan dengan cepat. Nilai dunia nyata ditampilkan untuk program yang melakukan sesuatu yang lebih bermakna daripada aplikasi demonstrasi kami.

Wawasan Mendalam, Mudah

Output strace dapat menunjukkan kepada Anda panggilan sistem mana yang sedang dibuat, mana yang dilakukan berulang kali, dan berapa banyak waktu eksekusi yang dihabiskan di dalam kode sisi kernel. Itu informasi yang bagus. Seringkali, ketika Anda mencoba memahami apa yang terjadi di dalam kode Anda, mudah untuk melupakan bahwa biner Anda berinteraksi hampir tanpa henti dengan kernel untuk menjalankan banyak fungsinya.

Dengan menggunakan strace , Anda melihat gambar yang lengkap.

TERKAIT: Laptop Linux Terbaik untuk Pengembang dan Penggemar