Mengumpulkan informasi pemuatan perakitan terperinci

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

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-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 dengan menekan Ctrl+C atau SIGTERM akan 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

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

    dotnet build
    
  2. Luncurkan 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 default
    
  3. Temukan ID proses aplikasi.

    dotnet-trace ps
    

    Output akan mencantumkan proses yang tersedia. Contohnya:

    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.

Lihat jejak

Buka jejak yang dikumpulkan di PerfView dan buka tampilan Peristiwa. Filter daftar peristiwa ke Microsoft-Windows-DotNETRuntime/AssemblyLoader peristiwa.

Filter pemuat rakitan gambar PerfView

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.

Gambar peristiwa Mulai dan Hentikan PerfView

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.

Gambar Resolusi Dicoba peristiwa PerfView

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.

Gambar peristiwa titik ekstensi PerfView

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.

Gambar peristiwa Mulai dan Hentikan yang berhasil dari PerfView

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.

Gambar peristiwa ResolutionAttempted yang berhasil dari PerfView

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.

Gambar peristiwa titik ekstensi PerfView yang berhasil

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.

Lihat juga