Cara mengesan panggilan sistem yang dibuat oleh proses dengan Strace on linux

Cara mengesan panggilan sistem yang dibuat oleh proses dengan Strace on linux

Ada kalanya berguna untuk memeriksa apa yang dilakukan oleh aplikasi yang sedang berjalan di bawah tudung, dan apa yang disebut sistem yang dilakukannya semasa pelaksanaannya. Untuk melaksanakan tugas sedemikian di Linux, kita boleh menggunakan Strace utiliti. Dalam artikel ini kita akan melihat cara memasangnya dan kami akan mempelajari penggunaan asasnya.

Dalam tutorial ini anda akan belajar:

  • Cara memasang Strace
  • Cara Menggunakan Strace Untuk Mengesan Sistem Panggilan yang Dibuat oleh proses
  • Cara Menapis Sistem Panggilan Sistem Spesifik
  • Cara melampirkan ke proses yang sudah berjalan
  • Cara menghasilkan ringkasan panggilan sistem
Cara mengesan panggilan sistem yang dibuat oleh proses dengan Strace on linux

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran-bebas
Perisian Strace
Yang lain Kebiasaan dengan antara muka baris arahan dan pengurusan proses linux
Konvensyen # - komando linux yang akan dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Linux-Commands akan dilaksanakan sebagai pengguna yang tidak layak

Pemasangan

Walaupun tidak dipasang secara lalai, Strace Utiliti boleh didapati di repositori rasmi semua pengagihan Linux utama; Ini bermaksud bahawa kami dapat memasangnya dengan mudah dengan menggunakan pengurus pakej kegemaran kami.

Sekiranya kita berjalan di Fedora (atau pengedaran lain dalam keluarga Red Hat), misalnya, kita mesti menggunakan DNF:

$ sudo DNF memasang strace 


Sekiranya kita lebih selesa menggunakan debian, atau pengagihan berasaskan debian seperti Ubuntu atau Linux Mint, kita boleh menggunakan Apt untuk mencapai hasil yang sama:

$ sudo apt memasang strace 

Sekiranya Arch Linux adalah pengedaran pilihan kami, kami boleh menggunakan Pacman untuk memasang aplikasi, yang terdapat di tambahan repositori:

$ sudo pacman -s strace 

Dengan perisian yang dipasang, kami boleh meneruskan ke hadapan, dan melihat beberapa contoh penggunaannya.

Memperkenalkan Strace

Seperti yang telah kita katakan, Strace adalah alat yang digunakan untuk menjejaki panggilan sistem yang dibuat oleh proses berjalan dan isyarat yang diterima olehnya. Panggilan sistem adalah antara muka asas antara aplikasi dan kernel Linux; Apabila kita menggunakan Strace, Nama panggilan yang dibuat oleh proses, bersama dengan hujah dan nilai pulangan mereka dipaparkan pada stderr (deskriptor fail ralat standard).

Mari lihat penggunaan asas Strace, untuk membiasakan dengan outputnya. Dalam penggunaannya yang paling asas, kami memanggil Strace diikuti oleh program yang ingin kami laksanakan dan siapa tingkah laku yang ingin kami analisis. Demi contoh ini, kami hanya akan menyalin fail menggunakan cp Perintah:

$ strace cp ~/.Bashrc Bashrc 

Output perintah agak panjang, dan tentu saja di sini kita tidak dapat menganalisisnya secara terperinci; Mari kita lihat baris pertama. Setiap baris di Strace output mengandungi:

  • Nama panggilan sistem
  • Hujah -hujah yang diserahkan kepada panggilan sistem dalam kurungan
  • Nilai pulangan panggilan sistem

Panggilan sistem pertama yang dapat kita lihat dalam output adalah execve. Panggilan ini digunakan untuk melaksanakan program dengan pelbagai hujah yang ditentukan. Hujah pertama yang diterima oleh execv adalah jalan fail yang kita mahu laksanakan; Yang kedua adalah pelbagai rentetan yang mewakili hujah -hujah yang akan diserahkan kepada program (hujah pertama, dengan konvensyen, sebagai nama program itu sendiri).

Dalam kes kita, seperti yang dijangkakan, binari yang dipanggil adalah /usr/bin/cp, Dan pelbagai hujah yang diserahkan kepada panggilan adalah: Nama program (CP), sumber dan laluan destinasi:

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

The / * 46 vars */ notasi bermaksud bahawa 46 pembolehubah di mana diwarisi dari proses panggilan (di execv fungsi persekitaran diambil dari luaran persekitaran berubah). Akhirnya, kami mempunyai nilai pulangan, yang dalam kes ini adalah 0 (Sebenarnya EXEC Keluarga fungsi mengembalikan nilai hanya jika ralat berlaku).

Penapis hanya panggilan sistem tertentu

Semasa menggunakan Strace Kadang -kadang kita mungkin mahu menjejaki hanya panggilan sistem spesifik yang dibuat oleh proses. Dalam situasi tersebut kita boleh menggunakan -e pilihan diikuti dengan ungkapan yang menunjukkan apa panggilan sistem harus dikesan. Katakan kita menjalankan arahan yang sama yang kita gunakan dalam contoh sebelumnya, tetapi kita hanya mahukan Baca Panggilan sistem untuk dipaparkan dalam output, kami akan menjalankan:

$ strace -e baca cp ~/.Bashrc Bashrc 

Seperti yang dijangkakan, hanya Baca Panggilan dilaporkan:

Output "Strace -e baca cp ~/.BASHRC BASHRC "perintah dengan cara, Baca Panggilan sistem mengambil tiga hujah: yang pertama adalah deskriptor fail dikaitkan dengan fail yang harus dibaca; yang kedua adalah penampan ke mana fail harus dibaca, dan ketiga adalah bilangan bait yang harus dibaca. Pada kejayaan, fungsi mengembalikan bilangan bait yang dibaca dari fail, seperti yang dapat kita perhatikan dalam output di atas.

Melampirkan tali pada proses yang sedang berjalan

Sehingga kini kami memohon Strace lulus kepadanya perintah yang akan dilaksanakan dan untuk menjaga jejak; Bagaimana jika kita mahu mengesan proses yang ada dan sudah berjalan? Dalam hal ini, kita mesti memohon Strace dengan -p (atau --Lampirkan) pilihan, dan lulus Pid (Proses ID) proses yang kita mahu melampirkannya.

Untuk mencari PID program, antara penyelesaian lain, kita boleh menggunakan pidof utiliti. Demi contoh ini kita akan melampirkan Strace ke contoh yang berjalan Gnome-terminal-server:

$ pidof gnome-terminal-server 121316 


The pidof Perintah dikembalikan 121316, yang merupakan pid-gnome-terminal-server. Mengetahui ini, kita boleh melampirkan Strace ke proses:

$ strace -p 121316 

Perintah di atas pada mulanya akan mengembalikan sesuatu seperti:

Output "Strace -P 121316" memerintahkan output di atas (dipotong) akan dikemas kini "dengan cepat" kerana panggilan sistem dilakukan. Untuk "melepaskan" Strace kita hanya boleh menekan Ctrl+c pada papan kekunci; Kami akan diberitahu tentang "detasmen", tetapi proses yang dikesan akan terus berjalan:
Strace: Proses 121316 Terpisah 

Isyarat mengesan

Terima kasih kepada Strace Kita juga dapat memerhatikan ketika proses menerima isyarat, dan bagaimana ia bertindak balas terhadapnya. Biarkan saya menunjukkannya. Pertama, kami melancarkan proses jangka panjang sebagai Atas, yang merupakan monitor proses:

$ atas 

Kita daripada melampirkan Strace kepadanya, setelah memperoleh PIDnya, yang dalam kes ini 44825:

$ strace -p 44825 

Pada ketika ini Strace mula menjejaki panggilan sistem yang dibuat oleh Atas, tetapi juga isyarat yang diterima olehnya. Untuk membuktikannya, kami menghantar a Sigterm ke pid 44825:

$ membunuh 44825 

Seperti yang dijangkakan, acara itu dilaporkan di Strace pengeluaran:

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

Dalam output di atas si_signo Adakah bilangan isyarat dihantar (sigterm = 15), si_code Mengandungi kod yang mengenal pasti punca isyarat (Si_user = 0): Dalam hal ini isyarat dihasilkan oleh proses pengguna. The si_pid dan si_uid Laporan Fields, masing -masing, Pid proses penghantaran dan Uid.

Simpan output Strace ke fail

Sekiranya kita menggunakan -o pilihan (pendek untuk --ouput) semasa melancarkan Strace, Kita boleh mengalihkan outputnya ke fail, melewati jalan sebagai hujah, sebagai contoh:

$ strace -p 121316 -o strace_output strace: Proses 121316 dilampirkan 

The strace_output fail akan dibuat dan output dari Strace akan ditulis di dalamnya. Untuk menonton kemas kini dalam fail yang boleh kita gunakan ekor: Biasanya arahan ini membaca 10 baris terakhir fail dan keluar, tetapi jika kita memanggilnya dengan -f pilihan (pendek untuk --ikuti) kita dapat memerhatikan sebagai kandungan baru dilampirkan:

$ ekor -f strace_output 


Cetak ringkasan panggilan sistem

The Strace Utiliti dilengkapi dengan ciri yang sangat berguna: keupayaan untuk menghasilkan ringkasan semua panggilan sistem yang dibuat oleh proses yang ditentukan. Sekiranya kita mahu menjana laporan sedemikian, yang perlu kita lakukan ialah memohon program dengan -c atau --Ringkasan sahaja pilihan. Mari kita ambil sebagai contoh cp Perintah yang kami gunakan sebelum ini:

$ strace -c cp ~/.Bashrc Bashrc 

Perintah di atas akan menghasilkan laporan ini:

% masa 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 Jumlah 

Seperti yang anda lihat, kerana kami menghasilkan ringkasan, output biasa dari Strace tidak dipaparkan. Sekiranya kita mahu menghasilkan ringkasan tetapi masih memperoleh output biasa program, kita mesti menggunakan -C pilihan sebaliknya, yang merupakan bentuk pendek --Ringkasan.

Kesimpulan

Dalam tutorial ini kita belajar cara memasang dan menggunakan Strace, utiliti yang bagus berguna untuk tujuan debug dan lebih umum untuk menjejaki panggilan sistem yang dilakukan oleh proses. Kami melihat bagaimana output dari Strace dianjurkan, bagaimana melancarkan program dan menjejaki sistem yang dipanggilnya, bagaimana melampirkan Strace kepada proses yang sudah berjalan dan bagaimana isyarat yang diterima oleh proses diberitahu; Akhirnya, kita melihat bagaimana untuk menghasilkan ringkasan semua panggilan yang dibuat oleh proses. Di sini kita hampir tidak menggaru permukaan apa yang boleh kita lakukan Strace: Sekiranya anda ingin mengetahui lebih lanjut mengenainya, nasihatnya, seperti biasa, untuk membaca manual!

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Fail Konfigurasi Linux: 30 teratas yang paling penting
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang perlu dipasang di Ubuntu 22.04
  • Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
  • Cara Menggunakan Perintah TCPDUMP di Linux
  • Bolehkah linux mendapat virus? Meneroka kelemahan Linux ..
  • Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?