Mengumpulkan informasi pemuatan perakitan terperinci
Dimulai dengan .NET 5, runtime dapat memancarkan peristiwa melalui EventPipe
dengan informasi terperinci tentang pemuatan rakitan terkelola untuk membantu mendiagnosis masalah pemuatan perakitan. Peristiwa ini dipancarkan oleh penyedia di Microsoft-Windows-DotNETRuntime
bawah AssemblyLoader
kata kunci (0x4
).
Prasyarat
- .NET 5 SDK atau versi yang lebih baru
- Alat
dotnet-trace
Catatan
Cakupan dotnet-trace
kemampuan lebih besar daripada mengumpulkan informasi pemuatan rakitan terperinci. Untuk informasi selengkapnya tentang penggunaan dotnet-trace
, lihat dotnet-trace
.
Mengumpulkan jejak dengan peristiwa pemuatan perakitan
Anda dapat menggunakan dotnet-trace
untuk melacak proses yang ada atau untuk meluncurkan proses anak 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 yang ditentukan <pid>
, memungkinkan AssemblyLoader
peristiwa di Microsoft-Windows-DotNETRuntime
penyedia. Hasilnya adalah .nettrace
file.
Gunakan dotnet-trace untuk meluncurkan proses turunan dan melacaknya dari startup
Terkadang mungkin berguna untuk mengumpulkan jejak proses dari startup-nya. 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.
Catatan
- Meluncurkan hello.exe melalui
dotnet-trace
mengalihkan input dan outputnya, dan Anda tidak akan dapat berinteraksi dengannya di konsol secara default. Gunakan sakelar--show-child-io
untuk berinteraksi denganstdin
danstdout
. - Keluar dari alat melalui Ctrl+C atau
SIGTERM
dengan aman mengakhiri alat dan proses anak. - 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 rakitan MyLibrary
- rakitan yang tidak direferensikan oleh aplikasi dan dengan demikian memerlukan penanganan dalam titik ekstensi pemuatan perakitan agar berhasil dimuat.
Mengumpulkan jejak
Navigasikan ke direktori dengan sampel yang diunduh. Membangun aplikasi dengan:
dotnet build
Luncurkan aplikasi dengan argumen yang menunjukkan bahwa aplikasi harus dijeda, menunggu penekanan tombol. Saat dilanjutkan, ia akan mencoba memuat rakitan dalam default
AssemblyLoadContext
- tanpa penanganan yang diperlukan untuk keberhasilan beban. Navigasikan ke direktori output dan jalankan:AssemblyLoading.exe /d default
Temukan ID proses aplikasi.
dotnet-trace ps
Output akan mencantumkan proses yang tersedia. Misalnya:
35832 AssemblyLoading C:\src\AssemblyLoading\bin\Debug\net5.0\AssemblyLoading.exe
Lampirkan
dotnet-trace
ke aplikasi yang sedang berjalan.dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
Di jendela yang menjalankan aplikasi, tekan tombol apa pun untuk membiarkan program berlanjut. Pelacakan akan secara otomatis berhenti setelah aplikasi keluar.
Menampilkan 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 beban untuk perakitan minat untuk contoh ini - MyLibrary
, kita dapat melakukan beberapa pemfilteran lagi.
Rakitan dimuat
Filter tampilan ke Start
peristiwa dan Stop
di bawah Microsoft-Windows-DotNETRuntime/AssemblyLoader
menggunakan daftar peristiwa di sebelah kiri. Tambahkan kolom AssemblyName
, ActivityID
, dan Success
ke tampilan. Filter ke peristiwa yang berisi MyLibrary
.
Nama Acara | AssemblyName | ActivityID | Berhasil |
---|---|---|---|
AssemblyLoader/Start |
MyLibrary, Culture=neutral, PublicKeyToken=null |
1/2/ | |
AssemblyLoader/Stop |
MyLibrary, Culture=neutral, PublicKeyToken=null |
1/2/ | Salah |
Anda akan melihat satu Start
/Stop
pasangan dengan Success=False
pada Stop
peristiwa, 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.
Perincian upaya untuk memuat
Untuk perincian operasi pemuatan yang lebih rinci, filter tampilan ke ResolutionAttempted
peristiwa di bawah Microsoft-Windows-DotNETRuntime/AssemblyLoader
menggunakan daftar peristiwa di sebelah kiri. Tambahkan kolom AssemblyName
, Stage
, dan Result
ke tampilan. Filter ke peristiwa dengan ID aktivitas dari Start
/Stop
pasangan.
Nama Acara | AssemblyName | Tahap | 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 perakitan 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, rakitan tidak ditemukan.
Titik 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. Filter ke peristiwa dengan ID aktivitas dari Start
/Stop
pasangan.
Nama Acara | AssemblyName | HandlerName |
---|---|---|
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 AssemblyLoadContext.Resolving peristiwa dan handler bernama OnAppDomainAssemblyResolve
dipanggil untuk peristiwa tersebut AppDomain.AssemblyResolve .
Mengumpulkan jejak lain
Jalankan aplikasi dengan argumen sehingga handler-nya untuk AssemblyLoadContext.Resolving peristiwa akan memuat assembly MyLibrary
.
AssemblyLoading /d default alc-resolving
Kumpulkan dan buka file lain .nettrace
menggunakan langkah-langkah dari atas.
Filter ke Start
peristiwa dan Stop
untuk MyLibrary
lagi. Anda akan melihat pasangan dengan pasangan Start
/Stop
lain 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 peristiwa, Stop
menunjukkan operasi pemuatan berhasil. Bidang ResultAssemblyPath
menunjukkan jalur rakitan yang dihasilkan.
Nama Acara | AssemblyName | ActivityID | Berhasil | 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 berhasil. Bidang ResultAssemblyPath
menunjukkan jalur rakitan yang dihasilkan.
Nama Acara | AssemblyName | Tahap | 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 |
AssemblyLoadContextResolvingHandlerInvoked
Melihat peristiwa akan menunjukkan bahwa handler bernama OnAssemblyLoadContextResolving
dipanggil. Bidang ResultAssemblyPath
menunjukkan jalur rakitan yang dikembalikan oleh handler.
Nama Acara | AssemblyName | HandlerName | ResultAssemblyPath |
---|---|---|---|
AssemblyLoader/AssemblyLoadContextResolvingHandlerInvoked |
MyLibrary, Culture=neutral, PublicKeyToken=null |
OnAssemblyLoadContextResolving |
C:\src\AssemblyLoading\bin\Debug\net5.0\MyLibrary.dll |
Perhatikan bahwa tidak ada lagi ResolutionAttempted
peristiwa dengan AppDomainAssemblyResolveEvent
tahap atau peristiwa apa pun AppDomainAssemblyResolveHandlerInvoked
, karena perakitan berhasil dimuat sebelum mencapai langkah algoritma pemuatan yang meningkatkan AppDomain.AssemblyResolve peristiwa.