Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Profiler adalah alat yang memantau eksekusi aplikasi lain. Profiler runtime bahasa umum (CLR) adalah pustaka tautan dinamis (DLL) yang terdiri dari fungsi yang menerima pesan dari, dan mengirim pesan ke, CLR dengan menggunakan API pembuatan profil. DLL profiler dimuat oleh CLR saat runtime.
Alat pembuatan profil tradisional berfokus pada mengukur eksekusi aplikasi. Artinya, mereka mengukur waktu yang dihabiskan di setiap fungsi atau penggunaan memori aplikasi dari waktu ke waktu. API pembuatan profil menargetkan kelas alat diagnostik yang lebih luas seperti utilitas cakupan kode dan bahkan bantuan penelusuran kesalahan tingkat lanjut. Semua kegunaan ini bersifat diagnostik. API pembuatan profil tidak hanya mengukur tetapi juga memantau eksekusi aplikasi. Untuk alasan ini, API pembuatan profil tidak boleh digunakan oleh aplikasi itu sendiri, dan eksekusi aplikasi tidak boleh bergantung pada (atau dipengaruhi oleh) profiler.
Pembuatan profil aplikasi CLR memerlukan lebih banyak dukungan daripada pembuatan profil kode mesin yang dikompilasi secara konvensional. Ini karena CLR memperkenalkan konsep seperti domain aplikasi, pengumpulan sampah, penanganan pengecualian terkelola, kompilasi kode just-in-time (JIT) (mengonversi bahasa perantara umum, atau CIL, kode menjadi kode mesin asli), dan fitur serupa. Mekanisme pembuatan profil konvensional tidak dapat mengidentifikasi atau memberikan informasi yang berguna tentang fitur-fitur ini. API pembuatan profil menyediakan informasi yang hilang ini secara efisien, dengan efek minimal pada performa CLR dan aplikasi yang difilmkan.
Kompilasi JIT pada runtime memberikan peluang yang baik untuk pembuatan profil. API pembuatan profil memungkinkan profiler mengubah aliran kode CIL dalam memori untuk rutinitas sebelum dikompilasi JIT. Dengan cara ini, profiler dapat secara dinamis menambahkan kode instrumentasi ke rutinitas tertentu yang membutuhkan penyelidikan yang lebih mendalam. Meskipun pendekatan ini dimungkinkan dalam skenario konvensional, jauh lebih mudah untuk diterapkan untuk CLR dengan menggunakan API pembuatan profil.
API Pembuatan Profil
Biasanya, API pembuatan profil digunakan untuk menulis profiler kode, yang merupakan program yang memantau eksekusi aplikasi terkelola.
API pembuatan profil digunakan oleh DLL profiler, yang dimuat ke dalam proses yang sama dengan aplikasi yang sedang diprofilkan. DLL profiler mengimplementasikan antarmuka panggilan balik (ICorProfilerCallback di .NET Framework versi 1.0 dan 1.1, ICorProfilerCallback2 di versi 2.0 dan yang lebih baru). CLR memanggil metode dalam antarmuka tersebut untuk memberi tahu profiler peristiwa dalam proses yang diprofilkan. Profiler dapat memanggil kembali ke runtime dengan menggunakan metode di antarmuka ICorProfilerInfo dan ICorProfilerInfo2 untuk mendapatkan informasi tentang status aplikasi yang diprofilkan.
Nota
Hanya bagian pengumpulan data dari solusi profiler yang harus berjalan dalam proses yang sama dengan aplikasi yang diprofilkan. Semua antarmuka pengguna dan analisis data harus dilakukan dalam proses terpisah.
Ilustrasi berikut menunjukkan bagaimana DLL profiler berinteraksi dengan aplikasi yang sedang difilterkan dan CLR.
Antarmuka Pemberitahuan
ICorProfilerCallback dan ICorProfilerCallback2 dapat dianggap sebagai antarmuka pemberitahuan. Antarmuka ini terdiri dari metode seperti ClassLoadStarted, ClassLoadFinished, dan JITCompilationStarted. Setiap kali CLR memuat atau membongkar kelas, mengkompilasi fungsi, dan sebagainya, CLR memanggil metode yang sesuai di profiler ICorProfilerCallback atau ICorProfilerCallback2 antarmuka.
Misalnya, profiler dapat mengukur performa kode melalui dua fungsi pemberitahuan: FunctionEnter2 dan FunctionLeave2. Ini hanya stempel waktu setiap pemberitahuan, mengakumulasi hasil, dan menghasilkan daftar yang menunjukkan fungsi mana yang paling banyak menggunakan CPU atau waktu jam dinding selama eksekusi aplikasi.
Antarmuka Pengambilan Informasi
Antarmuka utama lain yang terlibat dalam pembuatan profil adalah ICorProfilerInfo dan ICorProfilerInfo2. Profiler memanggil antarmuka ini sebagaimana diperlukan untuk mendapatkan informasi lebih lanjut untuk membantu analisisnya. Misalnya, setiap kali CLR memanggil fungsi FunctionEnter2 , CLR menyediakan pengidentifikasi fungsi. Profiler bisa mendapatkan informasi lebih lanjut tentang fungsi itu dengan memanggil metode ICorProfilerInfo2::GetFunctionInfo2 untuk menemukan kelas induk fungsi, namanya, dan sebagainya.
Fitur yang Didukung
API pembuatan profil menyediakan informasi tentang berbagai peristiwa dan tindakan yang terjadi dalam runtime bahasa umum. Anda dapat menggunakan informasi ini untuk memantau cara kerja proses dalam dan menganalisis performa aplikasi .NET Framework Anda.
API pembuatan profil mengambil informasi tentang tindakan dan peristiwa berikut yang terjadi di CLR:
Peristiwa mulai dan matikan CLR.
Peristiwa pembuatan dan penonaktifan domain aplikasi.
Peristiwa pemuatan dan pembongkaran rakitan.
Peristiwa pemuatan dan pembongkaran modul.
Peristiwa pembuatan dan penghancuran com vtable.
Kompilasi just-in-time (JIT) dan peristiwa pelemparan kode.
Peristiwa pemuatan dan pembongkaran kelas.
Peristiwa pembuatan dan penghancuran utas.
Peristiwa entri fungsi dan keluar.
Exceptions.
Transisi antara eksekusi kode terkelola dan tidak terkelola.
Transisi antara konteks runtime yang berbeda.
Informasi tentang penangguhan runtime.
Informasi tentang tumpukan memori runtime dan aktivitas pengumpulan sampah.
API pembuatan profil dapat dipanggil dari bahasa yang kompatibel dengan COM (tidak terkelola).
API efisien sehubungan dengan konsumsi CPU dan memori. Pembuatan profil tidak melibatkan perubahan pada aplikasi yang difilterkan yang cukup signifikan untuk menyebabkan hasil yang menyesatkan.
API pembuatan profil berguna untuk profiler pengambilan sampel dan non-pengambilan sampel. Profiler pengambilan sampel memeriksa profil pada tanda centang jam reguler, katakanlah, pada 5 milidetik terpisah. Profiler non-pengambilan sampel diberi tahu tentang peristiwa secara sinkron dengan utas yang menyebabkan peristiwa.
Fungsionalitas yang Tidak Didukung
API pembuatan profil tidak mendukung fungsionalitas berikut:
Kode tidak terkelola, yang harus diprofilkan menggunakan metode Win32 konvensional. Namun, profiler CLR mencakup peristiwa transisi untuk menentukan batas antara kode terkelola dan tidak terkelola.
Memodifikasi sendiri aplikasi yang memodifikasi kode mereka sendiri untuk tujuan seperti pemrograman berorientasi aspek.
Pemeriksaan batas, karena API pembuatan profil tidak memberikan informasi ini. CLR menyediakan dukungan intrinsik untuk pemeriksaan batas semua kode terkelola.
Pembuatan profil jarak jauh, yang tidak didukung karena alasan berikut:
Pembuatan profil jarak jauh memperpanjang waktu eksekusi. Saat Anda menggunakan antarmuka pembuatan profil, Anda harus meminimalkan waktu eksekusi sehingga hasil pembuatan profil tidak akan terpengaruh. Ini terutama berlaku ketika performa eksekusi sedang dipantau. Namun, pembuatan profil jarak jauh bukanlah batasan ketika antarmuka pembuatan profil digunakan untuk memantau penggunaan memori atau untuk mendapatkan informasi runtime tentang bingkai tumpukan, objek, dan sebagainya.
Profiler kode CLR harus mendaftarkan satu atau beberapa antarmuka panggilan balik dengan runtime di komputer lokal tempat aplikasi yang difilmkan berjalan. Ini membatasi kemampuan untuk membuat profiler kode jarak jauh.
Utas Pemberitahuan
Dalam kebanyakan kasus, utas yang menghasilkan peristiwa juga menjalankan pemberitahuan. Pemberitahuan tersebut (misalnya, FunctionEnter dan FunctionLeave) tidak perlu menyediakan eksplisit ThreadID. Selain itu, profiler mungkin memutuskan untuk menggunakan penyimpanan lokal utas untuk menyimpan dan memperbarui blok analisisnya alih-alih mengindeks blok analisis di penyimpanan global, berdasarkan ThreadID utas yang terpengaruh.
Perhatikan bahwa panggilan balik ini tidak diserialisasikan. Pengguna harus melindungi kode mereka dengan membuat struktur data aman utas dan dengan mengunci kode profiler jika perlu untuk mencegah akses paralel dari beberapa utas. Oleh karena itu, dalam kasus tertentu Anda dapat menerima urutan panggilan balik yang tidak biasa. Misalnya, asumsikan bahwa aplikasi terkelola menelurkan dua utas yang menjalankan kode yang identik. Dalam hal ini, dimungkinkan untuk menerima peristiwa ICorProfilerCallback::JITCompilationStarted untuk beberapa fungsi dari satu utas dan FunctionEnter panggilan balik dari utas lain sebelum menerima panggilan balik ICorProfilerCallback::JITCompilationFinished . Dalam hal ini, pengguna akan menerima FunctionEnter panggilan balik untuk fungsi yang mungkin belum sepenuhnya dikompilasi tepat waktu (JIT).
Keamanan
DLL profiler adalah DLL tidak terkelola yang berjalan sebagai bagian dari mesin eksekusi runtime bahasa umum. Akibatnya, kode dalam DLL profiler tidak tunduk pada pembatasan keamanan akses kode terkelola. Satu-satunya batasan pada DLL profiler adalah yang diberlakukan oleh sistem operasi pada pengguna yang menjalankan aplikasi yang difilterkan.
Penulis profiler harus mengambil tindakan pencegahan yang sesuai untuk menghindari masalah terkait keamanan. Misalnya, selama penginstalan, DLL profiler harus ditambahkan ke daftar kontrol akses (ACL) sehingga pengguna berbahaya tidak dapat memodifikasinya.
Menggabungkan Kode Terkelola dan Tidak Terkelola dalam Profiler Kode
Profiler yang salah ditulis dapat menyebabkan referensi melingkar ke dirinya sendiri, mengakibatkan perilaku yang tidak dapat diprediksi.
Tinjauan API pembuatan profil CLR dapat membuat kesan bahwa Anda dapat menulis profiler yang berisi komponen terkelola dan tidak terkelola yang saling memanggil melalui interop COM atau panggilan tidak langsung.
Meskipun ini dimungkinkan dari perspektif desain, API pembuatan profil tidak mendukung komponen terkelola. Profiler CLR harus benar-benar tidak dikelola. Upaya untuk menggabungkan kode terkelola dan tidak terkelola dalam profiler CLR dapat menyebabkan pelanggaran akses, kegagalan program, atau kebuntuan. Komponen terkelola profiler akan menembakkan peristiwa kembali ke komponen yang tidak dikelola, yang kemudian akan memanggil komponen terkelola lagi, menghasilkan referensi melingkar.
Satu-satunya lokasi di mana profiler CLR dapat memanggil kode terkelola dengan aman adalah dalam isi bahasa perantara umum (CIL) metode. Praktik yang direkomendasikan untuk memodifikasi isi CIL adalah menggunakan metode kompilasi ulang JIT di antarmuka ICorProfilerCallback4 .
Dimungkinkan juga untuk menggunakan metode instrumentasi yang lebih lama untuk memodifikasi CIL. Sebelum kompilasi fungsi just-in-time (JIT) selesai, profiler dapat menyisipkan panggilan terkelola dalam isi CIL metode lalu mengkompilasinya (lihat metode ICorProfilerInfo::GetILFunctionBody ). Teknik ini dapat berhasil digunakan untuk instrumentasi selektif kode terkelola, atau untuk mengumpulkan statistik dan data performa tentang JIT.
Atau, profiler kode dapat memasukkan kait asli ke dalam isi CIL dari setiap fungsi terkelola yang memanggil ke dalam kode yang tidak dikelola. Teknik ini dapat digunakan untuk instrumentasi dan cakupan. Misalnya, profiler kode dapat menyisipkan kait instrumentasi setelah setiap blok CIL untuk memastikan bahwa blok telah dijalankan. Modifikasi tubuh CIL dari metode adalah operasi yang sangat halus, dan ada banyak faktor yang harus dipertimbangkan.
Pembuatan Profil Kode Tidak Terkelola
API pembuatan profil bahasa umum (CLR) menyediakan dukungan minimal untuk pembuatan profil kode yang tidak dikelola. Fungsionalitas berikut disediakan:
Enumerasi rantai tumpukan. Fitur ini memungkinkan profiler kode untuk menentukan batas antara kode terkelola dan kode yang tidak dikelola.
Penentuan apakah rantai tumpukan sesuai dengan kode terkelola atau kode asli.
Dalam .NET Framework versi 1.0 dan 1.1, metode ini tersedia melalui subset dalam proses DARI CLR debugging API. Mereka didefinisikan dalam file CorDebug.idl.
Dalam metode .NET Framework 2.0 dan yang lebih baru, Anda dapat menggunakan metode ICorProfilerInfo2::D oStackSnapshot untuk fungsionalitas ini.
Menggunakan COM
Meskipun antarmuka pembuatan profil didefinisikan sebagai antarmuka COM, runtime bahasa umum (CLR) tidak benar-benar menginisialisasi COM untuk menggunakan antarmuka ini. Alasannya adalah untuk menghindari harus mengatur model utas dengan menggunakan fungsi CoInitialize sebelum aplikasi terkelola memiliki kesempatan untuk menentukan model utas yang diinginkan. Demikian pula, profiler itu sendiri tidak boleh memanggil CoInitialize, karena dapat memilih model utas yang tidak kompatibel dengan aplikasi yang diprofilkan dan dapat menyebabkan aplikasi gagal.
Tumpukan Panggilan
API pembuatan profil menyediakan dua cara untuk mendapatkan tumpukan panggilan: metode rekam jepret tumpukan, yang memungkinkan pengumpulan tumpukan panggilan yang jarang, dan metode tumpukan bayangan, yang melacak tumpukan panggilan di setiap instan.
Rekam Jepret Tumpukan
Rekam jepret tumpukan adalah jejak tumpukan utas secara instan. API pembuatan profil mendukung pelacakan fungsi terkelola pada tumpukan, tetapi meninggalkan pelacakan fungsi yang tidak dikelola ke stack walker profiler sendiri.
Untuk informasi selengkapnya tentang cara memprogram profiler untuk memandu tumpukan terkelola, lihat metode ICorProfilerInfo2::D oStackSnapshot dalam kumpulan dokumentasi ini, dan Profiler Stack Walking di .NET Framework 2.0: Basics and Beyond.
Tumpukan Bayangan
Menggunakan metode rekam jepret terlalu sering dapat dengan cepat membuat masalah performa. Jika Anda ingin sering mengambil jejak tumpukan, profiler Anda harus membangun tumpukan bayangan dengan menggunakan panggilan balik pengecualian FunctionEnter2, FunctionLeave2, FunctionTailcall2, dan ICorProfilerCallback2 . Tumpukan bayangan selalu terkini dan dapat dengan cepat disalin ke penyimpanan setiap kali rekam jepret tumpukan diperlukan.
Tumpukan bayangan dapat memperoleh argumen fungsi, mengembalikan nilai, dan informasi tentang instansiasi generik. Informasi ini hanya tersedia melalui tumpukan bayangan dan dapat diperoleh ketika kontrol diserahkan ke fungsi. Namun, informasi ini mungkin tidak tersedia nanti selama menjalankan fungsi.
Callback dan Kedalaman Tumpukan
Panggilan balik Profiler dapat dikeluarkan dalam keadaan yang sangat dibatasi tumpukan, dan luapan tumpukan dalam panggilan balik profiler akan menyebabkan proses segera keluar. Profiler harus memastikan untuk menggunakan tumpukan sesedikitan mungkin sebagai respons terhadap panggilan balik. Jika profiler dimaksudkan untuk digunakan terhadap proses yang kuat terhadap luapan tumpukan, profiler itu sendiri juga harus menghindari pemicu luapan tumpukan.
Topik Terkait
| Judul | Description |
|---|---|
| Menyiapkan Lingkungan Pembuatan Profil | Menjelaskan cara menginisialisasi profiler, mengatur pemberitahuan peristiwa, dan membuat profil Layanan Windows. |
| Antarmuka Pembuatan Profil | Menjelaskan antarmuka yang tidak dikelola yang digunakan API pembuatan profil. |
| Membuat Profil Fungsi Statis Global | Menjelaskan fungsi statis global yang tidak dikelola yang digunakan API pembuatan profil. |
| Enumerasi Pembuatan Profil | Menjelaskan enumerasi tidak terkelola yang digunakan API pembuatan profil. |
| Struktur Pembuatan Profil | Menjelaskan struktur tidak terkelola yang digunakan API pembuatan profil. |