Seorang kolega pernah mengatakan kepada saya bahwa opsi terakhir ketika semuanya gagal debug pada Linux adalah menggunakan strace .
Saya mencoba mempelajari ilmu di balik alat aneh ini, tetapi saya bukan guru sistem admin dan saya tidak benar-benar mendapatkan hasil.
Begitu,
- Apa itu sebenarnya dan apa fungsinya?
- Bagaimana dan dalam kasus apa sebaiknya digunakan?
- Bagaimana seharusnya output dipahami dan diproses?
Singkatnya, dengan kata-kata sederhana , bagaimana cara kerjanya?
man strace
sangat mudah dibaca dan bermanfaat. (PS belum tahu tentang strace sebelum kemarin dan bukan pakar Linux)Jawaban:
Ikhtisar Strace
strace dapat dilihat sebagai debugger ringan. Ini memungkinkan seorang programmer / pengguna untuk dengan cepat mengetahui bagaimana suatu program berinteraksi dengan OS. Ini dilakukan dengan memonitor panggilan dan sinyal sistem.
Menggunakan
Baik untuk ketika Anda tidak memiliki kode sumber atau tidak ingin diganggu untuk benar-benar pergi melalui itu.
Juga, berguna untuk kode Anda sendiri jika Anda tidak ingin membuka GDB, tetapi hanya tertarik untuk memahami interaksi eksternal.
Sebuah perkenalan kecil yang bagus
saya bertemu intro ini untuk menggunakan strace beberapa hari yang lalu: strace hello world
sumber
ltrace
stackoverflow.com/a/52012215/5884955-EFAULT
(oops, read-only buffer) atau-ENOENT
(oops, lari dari direktori yang salah di mana jalur relatif tidak berfungsi).)Dengan kata sederhana, strace melacak semua panggilan sistem yang dikeluarkan oleh suatu program bersama dengan kode kembali mereka. Pikirkan hal-hal seperti operasi file / socket dan banyak lagi yang tidak jelas.
Ini sangat berguna jika Anda memiliki pengetahuan tentang C karena di sini panggilan sistem akan lebih akurat untuk panggilan perpustakaan C standar.
Katakanlah program Anda adalah / usr / local / bin / cough. Cukup gunakan:
atau
untuk menulis ke 'out_file'.
Semua output strace akan menuju ke stderr (berhati-hatilah, volume tipisnya sering meminta pengalihan ke file). Dalam kasus yang paling sederhana, program Anda akan dibatalkan dengan kesalahan dan Anda akan dapat melihat di mana interaksi terakhirnya dengan OS dalam output strace.
Informasi lebih lanjut harus tersedia dengan:
sumber
strace mendaftar semua panggilan sistem yang dilakukan oleh proses yang diterapkan. Jika Anda tidak tahu apa arti panggilan sistem, Anda tidak akan bisa mendapatkan banyak jarak tempuh dari itu.
Namun demikian, jika masalah Anda melibatkan file atau path atau nilai lingkungan, menjalankan strace pada program yang bermasalah dan mengarahkan output ke file dan kemudian mengambil file itu untuk path / file / string env Anda dapat membantu Anda melihat apa yang sebenarnya sedang dicoba program Anda untuk lakukan. lakukan, berbeda dari apa yang Anda harapkan.
sumber
strace <prog_name>
untuk melacak suatu program.strace -o <out_file> <prog_name>
untuk keluar dimasukkan ke filestrace -e open myprog
ATAU untuk semua panggilan sistem terkait file:strace -e file myprog
Strace menonjol sebagai alat untuk menyelidiki sistem produksi di mana Anda tidak mampu menjalankan program-program ini di bawah debugger. Secara khusus, kami telah menggunakan strace dalam dua situasi berikut:
Untuk contoh menganalisis menggunakan strace lihat jawaban saya untuk pertanyaan ini .
sumber
Saya menggunakan strace setiap saat untuk men-debug masalah izin. Tekniknya seperti ini:
Di mana
gnome-calculator
perintah yang ingin Anda jalankan.sumber
strace -tfp PID akan memonitor panggilan sistem proses PID, sehingga kami dapat men-debug / memantau status proses / program kami.
sumber
Strace dapat digunakan sebagai alat debugging, atau sebagai profiler primitif.
Sebagai debugger, Anda dapat melihat bagaimana panggilan sistem yang diberikan dipanggil, dieksekusi dan apa yang mereka kembalikan. Ini sangat penting, karena memungkinkan Anda untuk melihat tidak hanya bahwa suatu program gagal, tetapi MENGAPA sebuah program gagal. Biasanya itu hanya hasil dari pengkodean yang buruk tidak menangkap semua hasil yang mungkin dari suatu program. Lain kali itu hanya jalur hardcoded ke file. Tanpa strace Anda bisa menebak apa yang salah di mana dan bagaimana. Dengan strace Anda mendapatkan rincian dari syscall, biasanya hanya dengan melihat nilai pengembalian memberitahu Anda banyak.
Pembuatan profil adalah kegunaan lain. Anda dapat menggunakannya untuk waktu eksekusi setiap syscall secara individual, atau sebagai agregat. Meskipun ini mungkin tidak cukup untuk memperbaiki masalah Anda, setidaknya akan sangat mempersempit daftar tersangka potensial. Jika Anda melihat banyak pasangan terbuka / tertutup pada satu file, Anda mungkin tidak perlu membuka dan menutup file setiap kali eksekusi loop, alih-alih membuka dan menutupnya di luar loop.
Ltrace adalah sepupu dekat Strace, juga sangat berguna. Anda harus belajar membedakan mana kemacetan Anda. Jika total eksekusi adalah 8 detik, dan Anda hanya menghabiskan 0,05 detik untuk panggilan sistem, maka mengganti program tidak akan banyak membantu Anda, masalahnya ada dalam kode Anda, yang biasanya merupakan masalah logika, atau program sebenarnya membutuhkan membutuhkan waktu lama untuk berjalan.
Masalah terbesar dengan strace / ltrace adalah membaca outputnya. Jika Anda tidak tahu bagaimana panggilan dibuat, atau setidaknya nama syscalls / fungsi, itu akan sulit untuk menguraikan artinya. Mengetahui fungsi yang dikembalikan juga bisa sangat bermanfaat, terutama untuk kode kesalahan yang berbeda. Meskipun sulit untuk diuraikan, terkadang mereka benar-benar mengembalikan mutiara pengetahuan; begitu saya melihat situasi di mana saya kehabisan inode, tetapi tidak keluar dari ruang kosong, jadi semua utilitas yang biasa tidak memberi saya peringatan, saya tidak bisa membuat file baru. Membaca kode kesalahan dari output strace menunjuk saya ke arah yang benar.
sumber
Strace adalah alat yang memberi tahu Anda bagaimana aplikasi Anda berinteraksi dengan sistem operasi Anda.
Itu melakukan ini dengan memberi tahu Anda apa sistem OS panggilan aplikasi Anda gunakan dan dengan apa parameter itu memanggil mereka.
Jadi misalnya Anda melihat file apa yang coba dibuka oleh program Anda, dan cuaca panggilan berhasil.
Anda dapat men-debug segala macam masalah dengan alat ini. Sebagai contoh jika aplikasi mengatakan bahwa itu tidak dapat menemukan perpustakaan yang Anda tahu telah Anda instal, Anda strace akan memberi tahu Anda di mana aplikasi mencari file itu.
Dan itu hanyalah puncak gunung es.
sumber
strace adalah alat yang baik untuk mempelajari bagaimana program Anda melakukan berbagai panggilan sistem (permintaan ke kernel) dan juga melaporkan yang gagal bersama dengan nilai kesalahan yang terkait dengan kegagalan itu. Tidak semua kegagalan adalah bug. Misalnya, kode yang mencoba mencari file mungkin mendapatkan kesalahan ENOENT (Tidak ada file atau direktori) tetapi itu mungkin skenario yang dapat diterima dalam logika kode.
Salah satu kasus penggunaan yang baik dari menggunakan strace adalah untuk men-debug kondisi ras selama pembuatan file sementara. Misalnya program yang mungkin membuat file dengan menambahkan ID proses (PID) ke beberapa string yang telah ditentukan mungkin menghadapi masalah dalam skenario multi-berulir. [PID + TID (id proses + id utas) atau panggilan sistem yang lebih baik seperti mkstemp akan memperbaikinya].
Ini juga bagus untuk debugging crash. Anda mungkin menemukan artikel (saya) ini tentang strace dan debugging macet berguna.
sumber
Contoh runnable minimal
Jika suatu konsep tidak jelas, ada contoh sederhana yang belum Anda lihat yang menjelaskannya.
Dalam hal ini, contoh itu adalah hello world assembly x86_64 freestanding (no libc) hello world:
hello.S
GitHub hulu .
Merakit dan menjalankan:
Output yang diharapkan:
Sekarang mari kita gunakan strace pada contoh itu:
Kita gunakan:
env -i ASDF=qwer
untuk mengontrol variabel lingkungan: /unix/48994/how-to-run-a-program-in-a-clean-environment-in-bash-s999 -v
untuk menampilkan informasi yang lebih lengkap tentang logstrace.log
sekarang mengandung:Dengan contoh minimal seperti itu, setiap karakter tunggal dari output jelas:
execve
baris: menunjukkan bagaimanastrace
dieksekusihello.out
, termasuk argumen dan lingkungan CLI seperti yang didokumentasikan diman execve
write
line: menunjukkan panggilan sistem tulis yang kami buat.6
adalah panjang dari string"hello\n"
.= 6
adalah nilai balik dari panggilan sistem, yang seperti yang didokumentasikanman 2 write
adalah jumlah byte yang ditulis.exit
line: menunjukkan panggilan keluar sistem yang kami buat. Tidak ada nilai balik, karena program berhenti!Contoh yang lebih kompleks
Penerapan strace tentu saja untuk melihat sistem mana yang memanggil program kompleks yang sebenarnya dilakukan untuk membantu men-debug / mengoptimalkan program Anda.
Khususnya, sebagian besar panggilan sistem yang mungkin Anda temui di Linux memiliki pembungkus glibc, banyak dari mereka dari POSIX .
Secara internal, pembungkus glibc menggunakan perakitan inline kurang lebih seperti ini: Bagaimana menjalankan panggilan sistem melalui sysenter dalam perakitan inline?
Contoh selanjutnya yang harus Anda pelajari adalah
write
dunia hello POSIX :main.c
Kompilasi dan jalankan:
Kali ini, Anda akan melihat bahwa banyak panggilan sistem sedang dilakukan oleh glibc sebelum
main
menyiapkan lingkungan yang bagus untuk main.Ini karena kita sekarang tidak menggunakan program berdiri bebas, melainkan program glibc yang lebih umum, yang memungkinkan fungsionalitas libc.
Kemudian, di setiap akhir,
strace.log
berisi:Jadi kami menyimpulkan bahwa
write
fungsi POSIX menggunakan, kejutan !, Linuxwrite
panggilan sistem .Kami juga mengamati bahwa
return 0
mengarah padaexit_group
panggilan alih-alihexit
. Ha, saya tidak tahu tentang yang ini! Inilah mengapastrace
sangat keren.man exit_group
kemudian menjelaskan:Dan di sini adalah contoh lain di mana saya mempelajari yang
dlopen
menggunakan sistem panggilan : /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710Diuji di Ubuntu 16.04, GCC 6.4.0, kernel Linux 4.4.0.
sumber
Berikut adalah beberapa contoh bagaimana saya menggunakan strace untuk menggali situs web. Semoga ini bisa membantu.
Periksa waktu untuk byte pertama seperti:
Lihat persentase tindakan yang melakukan apa. Banyak
lstat
danfstat
bisa menjadi indikasi bahwa sudah waktunya untuk menghapus cache:Output a
trace.txt
sehingga Anda dapat melihat dengan tepat panggilan apa yang sedang dibuat.Gunakan ini untuk memeriksa apakah sesuatu mengambil antara
.1
ke.9
detik untuk beban:Lihat file atau direktori yang hilang yang terperangkap di
strace
. Ini akan menampilkan banyak hal yang melibatkan sistem kami - bit yang relevan hanya melibatkan file pelanggan:sumber
Saya menyukai beberapa jawaban yang terbaca
strace
memeriksa bagaimana Anda berinteraksi dengan sistem operasi Anda.Inilah yang bisa kita lihat. Sistem memanggil. Jika Anda membandingkan
strace
danltrace
perbedaannya lebih jelas.Di sisi lain ada
ltrace
yang melacak fungsi.Meskipun saya telah memeriksa manual beberapa kali, saya belum menemukan asal nama
strace
tetapi kemungkinan jejak panggilan sistem, karena ini jelas.Ada tiga catatan yang lebih besar untuk dikatakan
strace
.Catatan 1: Kedua fungsi ini
strace
danltrace
menggunakan panggilan sistemptrace
. Jadiptrace
system call secara efektif carastrace
kerjanya.Catatan 2: Ada beberapa parameter yang dapat Anda gunakan
strace
, karenastrace
bisa sangat verbose. Saya suka bereksperimen dengan-c
yang seperti ringkasan hal-hal. Berdasarkan-c
Anda dapat memilih satu panggilan sistem seperti di-e trace=open
mana Anda hanya akan melihat panggilan itu. Ini bisa menarik jika Anda memeriksa file apa yang akan dibuka selama perintah yang Anda lacak. Dan tentu saja, Anda dapat menggunakangrep
untuk tujuan yang sama tetapi perhatikan bahwa Anda perlu mengarahkan ulang seperti ini2>&1 | grep etc
untuk memahami bahwa file konfigurasi direferensikan ketika perintah dikeluarkan.Catatan 3: Saya menemukan catatan yang sangat penting ini. Anda tidak terbatas pada arsitektur tertentu.
strace
akan mengejutkan Anda, karena dapat melacak binari dari arsitektur yang berbeda.sumber