Cara melacak panggilan sistem yang dilakukan oleh proses dengan strace di linux

Cara melacak panggilan sistem yang dilakukan oleh proses dengan strace di linux

Ada kalanya berguna untuk memeriksa apa yang dilakukan aplikasi yang berjalan di bawah kap, dan sistem apa yang disebutnya lakukan selama eksekusi. Untuk menyelesaikan tugas seperti itu di Linux, kita dapat menggunakan strace kegunaan. Dalam artikel ini kita akan melihat cara menginstalnya dan kami akan mempelajari penggunaan dasarnya.

Dalam tutorial ini Anda akan belajar:

  • Cara menginstal strace
  • Cara menggunakan strace untuk melacak panggilan sistem yang dilakukan oleh suatu proses
  • Cara memfilter panggilan sistem spesifik
  • Cara melampirkan ke proses yang sudah berjalan
  • Cara menghasilkan ringkasan panggilan sistem
Cara melacak panggilan sistem yang dilakukan oleh proses dengan strace di linux

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi-independen
Perangkat lunak Strace
Lainnya Keakraban dengan antarmuka baris perintah dan manajemen proses Linux
Konvensi # - Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$-Linux-Commands untuk dieksekusi sebagai pengguna biasa

Instalasi

Meskipun tidak diinstal secara default, strace Utilitas tersedia di repositori resmi dari semua distribusi Linux utama; Ini berarti kami dapat menginstalnya dengan sangat mudah dengan menggunakan manajer paket favorit kami.

Jika kita berlari di fedora (atau distribusi lainnya dalam keluarga Red Hat), misalnya, kita harus menggunakan dnf:

$ sudo dnf menginstal strace 


Jika kami lebih nyaman menggunakan Debian, atau distribusi berbasis Debian seperti Ubuntu atau Linux Mint, kami dapat menggunakan tepat Untuk mencapai hasil yang sama:

$ sudo apt install strace 

Jika Arch Linux adalah distribusi pilihan kami, kami dapat menggunakan Pacman untuk menginstal aplikasi, yang tersedia di tambahan gudang:

$ sudo pacman -s strace 

Dengan perangkat lunak yang diinstal, kami dapat melanjutkan, dan melihat beberapa contoh penggunaannya.

Memperkenalkan strace

Seperti yang sudah kami katakan, strace adalah alat yang digunakan untuk melacak panggilan sistem yang dilakukan oleh proses berjalan dan sinyal yang diterima olehnya. Panggilan sistem adalah antarmuka mendasar antara aplikasi dan kernel Linux; Saat kami menggunakan strace, Nama panggilan yang dilakukan oleh suatu proses, bersama dengan argumen mereka dan nilai pengembalian ditampilkan Stderr (Deskriptor File Kesalahan Standar).

Mari kita lihat penggunaan dasar strace, untuk membiasakan dengan outputnya. Dalam penggunaannya yang paling mendasar, kami menelepon strace diikuti oleh program yang ingin kami jalankan dan siapa perilaku yang ingin kami analisis. Demi contoh ini, kami hanya akan menyalin file menggunakan cp memerintah:

$ strace cp ~/.Bashrc Bashrc 

Output dari perintah cukup panjang, dan tentu saja di sini kita tidak dapat menganalisisnya secara rinci; Mari kita lihat baris pertama. Setiap baris di strace Output berisi:

  • Nama panggilan sistem
  • Argumen yang diteruskan ke panggilan sistem dalam tanda kurung
  • Nilai Pengembalian Sistem Panggilan

Panggilan sistem pertama yang dapat kita lihat di output adalah execve. Panggilan ini digunakan untuk menjalankan program dengan array argumen tertentu. Argumen pertama yang diterima oleh execv adalah jalur file yang ingin kami jalankan; Yang kedua adalah array string yang mewakili argumen yang akan diteruskan ke program (argumen pertama, dengan konvensi, menjadi nama program itu sendiri).

Dalam kasus kami, seperti yang diharapkan, biner yang disebut /usr/bin/cp, dan array argumen yang diteruskan ke panggilan adalah: nama program (CP), sumber dan jalur tujuan:

execve ("/usr/bin/cp", ["cp", "/home/egdoc/.Bashrc "," Bashrc "], 0x7fff53d4e4c0 / * 46 vars * /) = 0 

Itu / * 46 vars */ Notasi berarti bahwa 46 variabel di mana diwarisi dari proses panggilan (di execv Fungsi Lingkungan diambil dari eksternal mengepung variabel). Akhirnya, kami memiliki nilai pengembalian, yang dalam hal ini 0 (Sebenarnya EXEC Keluarga fungsi mengembalikan nilai hanya jika terjadi kesalahan).

Menyaring hanya panggilan sistem tertentu

Ketika menggunakan strace Terkadang kita mungkin ingin melacak hanya panggilan sistem spesifik yang dilakukan oleh suatu proses. Dalam situasi itu kita dapat menggunakan -e Opsi diikuti oleh ekspresi yang menunjukkan panggilan sistem apa yang harus dilacak. Misalkan kita menjalankan perintah yang sama yang kita gunakan dalam contoh sebelumnya, tetapi kita hanya ingin membaca Panggilan sistem untuk ditampilkan dalam output, kami akan menjalankan:

$ strace -e baca cp ~/.Bashrc Bashrc 

Seperti yang diharapkan, hanya membaca Panggilan dilaporkan:

Output dari "strace -e baca cp ~/.perintah Bashrc Bashrc "Ngomong -ngomong, membaca Sistem Panggilan mengambil tiga argumen: Yang pertama adalah a deskriptor file terkait dengan file yang harus dibaca; yang kedua adalah penyangga ke mana file harus dibaca, dan ketiga adalah jumlah byte yang harus dibaca. Pada keberhasilan, fungsi mengembalikan jumlah byte yang dibaca dari file, seperti yang dapat kita amati dalam output di atas.

Melampirkan strace pada proses berjalan

Sampai sekarang kami memohon strace Melewati perintah untuk dieksekusi dan untuk melacak; Bagaimana jika kita ingin melacak proses yang sudah ada dan sudah berjalan? Dalam hal ini, kita harus memohon strace dengan -P (atau --menempel) opsi, dan lulus Pid (ID proses) dari proses yang ingin kami lampirkan.

Untuk menemukan PID suatu program, di antara solusi lainnya, kami dapat menggunakan pidof kegunaan. Demi contoh ini kita akan melampirkan strace ke instance berjalan Gnome-terminal-server:

$ pidof gnome-terminal-server 121316 


Itu pidof perintah dikembalikan 121316, yang merupakan pid dari server terminal gnome. Mengetahui hal ini, kita bisa melampirkan strace untuk prosesnya:

$ strace -p 121316 

Perintah di atas awalnya akan mengembalikan sesuatu seperti:

Output dari perintah "Strace -P 121316" output di atas (terpotong) akan diperbarui "on the fly" saat panggilan sistem dilakukan. Untuk "melepaskan" strace Kami bisa menekan Ctrl+c di keyboard; Kami akan diberitahu tentang "detasemen", tetapi proses yang dilacak akan terus berjalan:
Strace: Proses 121316 terpisah 

Penelusuran sinyal

Terimakasih untuk strace kita juga dapat mengamati ketika suatu proses menerima sinyal, dan bagaimana reaksinya. Biarkan saya mendemonstrasikannya. Pertama, kami meluncurkan proses berjalan lama atas, yang merupakan monitor proses:

$ top 

Kami daripada melampirkan strace untuk itu, setelah mendapatkan PID, yang dalam hal ini 44825:

$ strace -p 44825 

Pada saat ini strace Mulai melacak panggilan sistem yang dilakukan oleh atas, tetapi juga sinyal yang diterima olehnya. Untuk membuktikannya, kami mengirim Sigterm ke pid 44825:

$ Bunuh 44825 

Seperti yang diharapkan, acara ini dilaporkan di strace keluaran:

--- Sigterm si_signo = sigterm, si_code = si_user, si_pid = 44888, si_uid = 1000 --- 

Di output di atas si_signo adalah jumlah sinyal yang dikirimkan (sigterm = 15), si_code Berisi kode yang mengidentifikasi penyebab sinyal (si_user = 0): Dalam hal ini sinyal dihasilkan oleh proses pengguna. Itu si_pid Dan si_uid Laporan bidang, masing -masing, Pid dari proses pengiriman dan itu Uid.

Simpan output strace ke file

Jika kita menggunakan -Hai opsi (pendek untuk --ouput) saat meluncurkan strace, Kita dapat mengarahkan outputnya ke file, meneruskan jalur sebagai argumen, misalnya:

$ strace -p 121316 -o strace_output strace: proses 121316 terlampir 

Itu strace_output file akan dibuat dan output strace akan ditulis di dalamnya. Untuk menonton pembaruan di file, kami dapat menggunakan ekor: Biasanya perintah ini membaca 10 baris terakhir dari file dan keluar, tetapi jika kita menyebutnya dengan -F opsi (pendek untuk --mengikuti) Kita dapat mengamati karena konten baru ditambahkan:

$ tail -f strace_output 


Cetak ringkasan panggilan sistem

Itu strace Utilitas dilengkapi dengan fitur yang sangat berguna: kemampuan untuk menghasilkan ringkasan semua panggilan sistem yang dilakukan oleh proses yang ditentukan. Jika kami ingin membuat laporan seperti itu, yang harus kami lakukan adalah memohon program dengan -C atau --hanya ringkasan pilihan. Mari kita ambil sebagai contoh cp Perintah yang kami gunakan sebelumnya:

$ strace -c cp ~/.Bashrc Bashrc 

Perintah di atas akan menghasilkan laporan ini:

% waktu detik usecs/panggilan panggilan kesalahan syscall ------ ----------- ----------- --------- ---- ----- ---------------- 25.71 0.000298 7 38 13 Openat 19.24 0.000223 4 51 mmap 11.48 0.000133 4 28 Tutup 9.92 0.000115 57 2 1 newfstatat 7.94 0.000092 10 9 mProtect 6.99 0.000081 3 25 fstat 2.85 0.000033 3 11 Baca 2.76 0.000032 16 2 munmap 2.50 0.000029 14 2 Statfs 1.90 0.000022 22 1 Tulis 1.55 0.000018 2 8 Pread64 1.38 0.000016 8 2 1 Akses 1.04 0.000012 4 3 Brk 0.78 0.000009 4 2 rt_sigaction 0.60 0.000007 7 1 Futex 0.52 0.000006 3 2 1 ARCH_PRCTL 0.43 0.000005 5 1 RT_SIGPROCMASK 0.43 0.000005 5 1 set_tid_address 0.43 0.000005 5 1 fadvise64 0.43 0.000005 5 1 set_robust_list 0.43 0.000005 5 1 prlimit64 0.26 0.000003 3 1 1 Stat 0.26 0.000003 3 1 1 lseek 0.17 0.000002 2 1 geteuid 0.00 0.000000 0 1 EXECVE ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001159 5 196 18 Total 

Seperti yang Anda lihat, karena kami menghasilkan ringkasan, output normal strace tidak ditampilkan. Jika kami ingin menghasilkan ringkasan tetapi masih mendapatkan output reguler dari program ini, kami harus menggunakan -C Opsi sebagai gantinya, yang merupakan bentuk pendek dari --ringkasan.

Kesimpulan

Dalam tutorial ini kami belajar cara menginstal dan menggunakan strace, utilitas bagus yang berguna untuk tujuan debugging dan lebih umum untuk melacak panggilan sistem yang dilakukan oleh suatu proses. Kami melihat bagaimana outputnya strace terorganisir, cara meluncurkan program dan melacak panggilan sistem yang dibuat, cara melampirkan strace untuk proses yang sudah berjalan dan bagaimana sinyal yang diterima oleh suatu proses diberitahu; Akhirnya, kami melihat cara menghasilkan ringkasan semua panggilan yang dilakukan oleh suatu proses. Di sini kami hampir tidak menggaruk permukaan apa yang bisa kami lakukan strace: Jika Anda ingin tahu lebih banyak tentang itu, sarannya adalah, seperti biasa, untuk membaca manual!

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • File Konfigurasi Linux: 30 Teratas Paling Penting
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus diinstal pada Ubuntu 22.04
  • Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
  • Cara menggunakan perintah tcpdump di linux
  • Can Linux mendapatkan virus? Menjelajahi kerentanan Linux…
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?