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

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 dengan stdin dan stdout.
  • 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

  1. Navigasikan ke direktori dengan sampel yang diunduh. Membangun aplikasi dengan:

    dotnet build
    
  2. 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
    
  3. 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
    
  4. Lampirkan dotnet-trace ke aplikasi yang sedang berjalan.

    dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4 --process-id 35832
    
  5. 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.

PerfView assembly loader filter image

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.

PerfView Start and Stop events image

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.

PerfView ResolutionAttempted events image

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.

PerfView extension point events image

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.

PerfView successful Start and Stop events image

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.

PerfView successful ResolutionAttempted events image

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.

PerfView successful extension point events image

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.

Lihat juga