Bagikan melalui


Men-debug cadangan memori terkelola dengan .NET Diagnostic Analyzers

Dalam tutorial ini, Anda akan:

  • Membuka cadangan memori
  • Memilih dan menjalankan penganalisis terhadap cadangan
  • Meninjau hasil penganalisis
  • Menavigasi ke kode bermasalah

Dalam contoh yang dijelaskan dalam artikel ini, yang menjadi perhatian adalah bahwa aplikasi Anda tidak merespons permintaan secara tepat waktu.

Membuka cadangan memori di Visual Studio

  1. Buka cadangan memori di Visual Studio dengan menggunakan perintah menu File > Buka > File dan pilih cadangan memori Anda.

  2. Perhatikan pada halaman Ringkasan Cadangan Memori Tindakan baru yang disebut Jalankan Analisis Diagnostik.

    Action - Diagnostics Analysis

  3. Pilih tindakan ini untuk memulai debugger dan membuka halaman Analisis Diagnostik baru dengan daftar opsi penganalisis yang tersedia, yang diatur oleh gejala yang mendasar.

Memilih dan menjalankan penganalisis terhadap cadangan

Untuk menyelidiki gejala-gejala ini, opsi terbaik tersedia di bawah Responsivitas Proses karena paling cocok dengan masalah dalam contoh ini.

Select diagnostics analyzers

  1. Klik tombol Analisis untuk memulai proses investigasi

  2. Penganalisis akan menyajikan hasil berdasarkan kombinasi info proses dan data CLR yang diambil dalam cadangan memori.

Meninjau hasil penganalisis

  1. Dalam hal ini, penganalisis telah menemukan dua kesalahan. Pilih hasil penganalisis untuk melihat Ringkasan Analisis dan Remediasi yang disarankan.

    Diagnostics analyzers results

  2. Ringkasan Analisis telah menyatakan bahwa "kumpulan utas CLR mengalami kelaparan". Informasi ini menunjukkan bahwa CLR saat ini telah menggunakan semua utas kumpulan utas yang tersedia, yang berarti layanan Anda tidak dapat menanggapi permintaan baru hingga utas dirilis.

    Catatan

    Remediasi dalam hal ini adalah "Jangan menunggu secara sinkron di Monitor, Peristiwa, Tugas, atau objek lain yang dapat memblokir utas Anda. Lihat apakah Anda dapat memperbarui metode menjadi asinkron.".

Tugas Saya selanjutnya adalah menemukan kode yang bermasalah.

  1. Mengeklik tautan Tampilkan tumpukan panggilan Visual Studio akan segera beralih ke utas yang menunjukkan perilaku ini.

  2. Jendela Tumpukan Panggilan akan menampilkan metode yang mungkin berpotensi dengan cepat membedakan antara kode saya (SyncOverAsyncExmple.) dari kode Kerangka Kerja (Sistem.).

    Diagnostics analyzers link to call stack

  3. Setiap bingkai tumpukan panggilan sesuai dengan metode dan dengan mengeklik dua kali pada bingkai tumpukan Visual Studio akan menavigasi ke kode yang mengarah langsung ke skenario ini pada utas ini.

  4. Namun, dalam contoh ini, tidak ada simbol atau kode, pada halaman Simbol yang tidak dimuat, Anda dapat memilih opsi Dekompilasi Kode sumber.

    Decompilation

  5. Dalam sumber yang didekompresi di bawah ini terbukti bahwa Tugas asinkron (ConsumeThreadPoolThread) memanggil fungsi pemblokiran sinkron.

    Catatan

    Metode "DoSomething()" yang berisi metode WaitHandle.WaitOne, yang memblokir utas kumpulan utas saat ini hingga menerima sinyal.

    Untuk meningkatkan daya tanggap aplikasi, penting untuk menghapus pemblokiran kode sinkron dari semua konteks asinkron.

    Analyze decompiled code