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.
Dimulai dengan .NET 5, runtime dapat memancarkan peristiwa melalui EventPipe dengan informasi rinci mengenai pemuatan rakitan terkelola untuk membantu mendiagnosis masalah pemuatan rakitan.
Peristiwa ini dikeluarkan oleh penyedia dengan Microsoft-Windows-DotNETRuntime kata kunci AssemblyLoader (0x4).
Prasyarat
- .NET 5 SDK atau versi yang lebih baru
- Alat
dotnet-trace
Nota
Cakupan kemampuan dotnet-trace lebih dari sekadar mengumpulkan informasi pemuatan rakitan secara terperinci. Untuk informasi selengkapnya tentang penggunaan dotnet-trace, lihat dotnet-trace.
Mengumpulkan rekaman jejak dengan peristiwa pemuatan rakitan
Anda dapat menggunakan dotnet-trace untuk melacak proses yang sudah ada atau memulai proses turunan dan melacaknya dari startup.
Melacak proses yang ada
Untuk mengaktifkan peristiwa pemuatan perakitan di runtime dan mengumpulkan jejaknya, gunakan dotnet-trace dengan perintah berikut:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id <pid>
Perintah ini mengumpulkan jejak dari <pid> yang ditentukan, mengaktifkan acara AssemblyLoader dalam penyedia Microsoft-Windows-DotNETRuntime. Hasilnya adalah .nettrace file.
Gunakan dotnet-trace untuk meluncurkan proses turunan dan melacaknya sejak awal.
Terkadang mungkin berguna untuk mengumpulkan pelacakan proses dari awalnya. Untuk aplikasi yang menjalankan .NET 5 atau yang lebih baru, Anda dapat menggunakan dotnet-trace untuk melakukan ini.
Perintah berikut meluncurkan hello.exe dengan arg1 dan arg2 sebagai argumen baris perintahnya dan mengumpulkan jejak dari startup runtime-nya:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 -- hello.exe arg1 arg2
Anda dapat berhenti mengumpulkan jejak dengan menekan Enter atau Ctrl + C. Ini juga menutup hello.exe.
Nota
- Meluncurkan hello.exe melalui
dotnet-tracemengalihkan input dan outputnya, dan Anda tidak akan dapat berinteraksi dengannya di konsol secara default. Gunakan sakelar--show-child-iountuk berinteraksi denganstdindanstdout. - Keluar dari alat dengan menekan Ctrl+C atau
SIGTERMakan mengakhiri alat dan proses bawahannya dengan aman. - Jika proses anak keluar sebelum alat, alat keluar juga dan jejak harus dapat dilihat dengan aman.
Menampilkan jejak
File jejak yang dikumpulkan dapat dilihat di Windows menggunakan tampilan Peristiwa di PerfView. Semua peristiwa pemuatan perakitan akan diawali dengan Microsoft-Windows-DotNETRuntime/AssemblyLoader.
Contoh (di Windows)
Contoh ini menggunakan sampel titik ekstensi pemuatan perakitan. Aplikasi mencoba memuat sebuah assembly MyLibrary - sebuah assembly yang tidak direferensikan oleh aplikasi dan oleh karena itu memerlukan penanganan pada titik ekstensi pemuatan assembly untuk dapat dimuat dengan sukses.
Mengumpulkan jejak
Navigasikan ke direktori dengan sampel yang diunduh. Bangun aplikasi dengan:
dotnet buildLuncurkan aplikasi dengan argumen yang menunjukkan bahwa aplikasi harus dijeda, menunggu penekanan tombol. Saat dilanjutkan, ia akan mencoba memuat assembly dalam default
AssemblyLoadContext- tanpa penanganan yang diperlukan agar pemuatannya berhasil. Navigasikan ke direktori output dan jalankan:AssemblyLoading.exe /d defaultTemukan ID proses aplikasi.
dotnet-trace psOutput akan mencantumkan proses yang tersedia. Contohnya:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exeLampirkan
dotnet-traceke aplikasi yang sedang berjalan.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832Di jendela yang menjalankan aplikasi, tekan tombol apa pun untuk membiarkan program berlanjut. Pelacakan akan secara otomatis berhenti setelah aplikasi keluar.
Lihat jejak
Buka jejak yang dikumpulkan di PerfView dan buka tampilan Peristiwa. Filter daftar peristiwa ke Microsoft-Windows-DotNETRuntime/AssemblyLoader peristiwa.
Semua beban rakitan yang terjadi dalam aplikasi setelah pelacakan dimulai akan ditampilkan. Untuk memeriksa operasi pemuatan untuk perakitan yang diminati untuk contoh ini - MyLibrary, kita dapat melakukan penyaringan lebih lanjut.
Pemuatan rakitan
Filter tampilan ke acara Start dan Stop terkait Microsoft-Windows-DotNETRuntime/AssemblyLoader menggunakan daftar acara di sebelah kiri. Tambahkan kolom AssemblyName, ActivityID, dan Success ke tampilan. Saring peristiwa yang berisi MyLibrary.
| Nama Peristiwa | AssemblyName | ActivityID | Keberhasilan |
|---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Tidak benar |
Anda seharusnya melihat satu pasangan Start/Stop dengan Success=False pada kejadian Stop, yang menunjukkan operasi pemuatan gagal. Perhatikan bahwa kedua peristiwa tersebut memiliki ID aktivitas yang sama. ID aktivitas dapat digunakan untuk memfilter semua peristiwa pemuat rakitan lainnya hanya untuk yang sesuai dengan operasi beban ini.
Kegagalan upaya untuk memuat
Untuk perincian lebih lanjut tentang operasi pemuatan, saring tampilan pada acara ResolutionAttempted di bawah Microsoft-Windows-DotNETRuntime/AssemblyLoader dengan menggunakan daftar peristiwa di sebelah kiri. Tambahkan kolom AssemblyName, Stage, dan Result ke tampilan. Memfilter kejadian berdasarkan ID aktivitas dari pasangan Start/Stop.
| Nama Peristiwa | AssemblyName | Panggung | Hasil |
|---|---|---|---|
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
FindInLoadContext |
AssemblyNotFound |
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
ApplicationAssemblies |
AssemblyNotFound |
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
AssemblyLoadContextResolvingEvent |
AssemblyNotFound |
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
AppDomainAssemblyResolveEvent |
AssemblyNotFound |
Peristiwa di atas menunjukkan bahwa pemuat rakitan mencoba menyelesaikan rakitan dengan melihat dalam konteks beban saat ini, menjalankan logika pemeriksaan default untuk rakitan aplikasi terkelola, memanggil handler untuk peristiwa AssemblyLoadContext.Resolving, dan memanggil handler untuk AppDomain.AssemblyResolve. Untuk semua langkah ini, bagian komponen tidak ditemukan.
Poin ekstensi
Untuk melihat titik ekstensi mana yang dipanggil, filter tampilan ke AssemblyLoadContextResolvingHandlerInvoked dan AppDomainAssemblyResolveHandlerInvoked di bawah Microsoft-Windows-DotNETRuntime/AssemblyLoader menggunakan daftar peristiwa di sebelah kiri. Tambahkan kolom AssemblyName dan HandlerName ke tampilan. Memfilter kejadian berdasarkan ID aktivitas dari pasangan Start/Stop.
| Nama Peristiwa | AssemblyName | Nama Pengendali |
|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
AssemblyLoader/AppDomainAssemblyResolveHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAppDomainAssemblyResolve |
Peristiwa di atas menunjukkan bahwa handler bernama OnAssemblyLoadContextResolving dipanggil untuk event AssemblyLoadContext.Resolving dan handler bernama OnAppDomainAssemblyResolve dipanggil untuk event AppDomain.AssemblyResolve.
Kumpulkan jejak lainnya
Jalankan aplikasi dengan argumen agar penanganan untuk peristiwa AssemblyLoadContext.Resolving akan memuat assembly MyLibrary tersebut.
AssemblyLoading /d default alc-resolving
Kumpulkan dan buka file lain .nettrace menggunakan langkah-langkah dari atas.
Filter peristiwa Start dan Stop untuk MyLibrary sekali lagi. Anda seharusnya melihat pasangan Start/Stop dengan pasangan lain yang memiliki Start/Stop di antara mereka. Operasi beban dalam mewakili beban yang dipicu oleh handler AssemblyLoadContext.Resolving ketika disebut AssemblyLoadContext.LoadFromAssemblyPath. Kali ini, Anda akan melihat Success=True pada Stop peristiwa, menunjukkan operasi pemuatan berhasil. Bidang ResultAssemblyPath menunjukkan jalur rakitan yang dihasilkan.
| Nama Peristiwa | AssemblyName | ActivityID | Keberhasilan | ResultAssemblyPath |
|---|---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | ||
AssemblyLoader/Start |
MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null |
//1/2/1/ | ||
AssemblyLoader/Stop |
MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null |
//1/2/1/ | Benar | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
//1/2/ | Benar | C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Kita kemudian dapat melihat ResolutionAttempted peristiwa dengan ID aktivitas dari beban luar untuk menentukan langkah di mana assembly berhasil diselesaikan. Kali ini, acara akan menunjukkan bahwa AssemblyLoadContextResolvingEvent panggung tersebut berhasil. Bidang ResultAssemblyPath menunjukkan jalur rakitan yang dihasilkan.
| Nama Peristiwa | AssemblyName | Panggung | Hasil | ResultAssemblyPath |
|---|---|---|---|---|
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
FindInLoadContext |
AssemblyNotFound |
|
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
ApplicationAssemblies |
AssemblyNotFound |
|
AssemblyLoader/ResolutionAttempted |
MyLibrary, Culture=neutral, PublicKeyToken=null |
AssemblyLoadContextResolvingEvent |
Success |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Melihat AssemblyLoadContextResolvingHandlerInvoked peristiwa akan menunjukkan bahwa handler dengan nama OnAssemblyLoadContextResolving telah dipanggil. Bidang ResultAssemblyPath menunjukkan jalur rangkaian yang dikembalikan oleh handler.
| Nama Peristiwa | AssemblyName | Nama Pengendali | ResultAssemblyPath |
|---|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Perhatikan bahwa tidak ada lagi ResolutionAttempted kejadian dengan tahap AppDomainAssemblyResolveEvent atau kejadian apapun AppDomainAssemblyResolveHandlerInvoked, karena perakitan berhasil dimuat sebelum mencapai langkah algoritma pemuatan yang memicu AppDomain.AssemblyResolve kejadian.