Ladění výpisu spravované paměti pomocí diagnostických analyzátorů .NET

V tomto kurzu:

  • Otevření výpisu paměti
  • Výběr a spuštění analyzátorů s výpisem paměti
  • Kontrola výsledků analyzátorů
  • Přechod na problematický kód

V příkladu popsaném v tomto článku se jedná o problém, že vaše aplikace včas nereaguje na požadavky.

Otevření výpisu paměti v sadě Visual Studio

  1. V sadě Visual Studio otevřete výpis paměti pomocí příkazu nabídky Soubor > otevřít > soubor a vyberte výpis paměti.

  2. Všimněte si na stránce Souhrn výpisu paměti novou akci s názvem Spustit analýzu diagnostiky.

    Action - Diagnostics Analysis

  3. Tuto akci vyberte, pokud chcete spustit ladicí program a otevřít novou stránku Diagnostické analýzy se seznamem dostupných možností analyzátoru uspořádaných podle základního příznaku.

Výběr a spuštění analyzátorů s výpisem paměti

Pokud chcete tyto příznaky prozkoumat, nejlepší možnosti jsou k dispozici v části Odezva procesu, protože nejlépe odpovídá problému v tomto příkladu.

Select diagnostics analyzers

  1. Kliknutím na tlačítko Analyzovat zahájíte proces šetření.

  2. Analyzátor zobrazí výsledky na základě kombinace informací o procesu a dat CLR zachycených v výpisu paměti.

Kontrola výsledků analyzátorů

  1. V tomto případě analyzátor zjistil dvě chyby. Vyberte výsledek analyzátoru, abyste zobrazili souhrn analýzy a navrhli nápravu.

    Diagnostics analyzers results

  2. Souhrn analýzy uvedl, že u fondu vláken CLR dochází k hladovění. Tyto informace naznačují, že MODUL CLR v současné době používal všechna dostupná vlákna fondu vláken, což znamená, že vaše služba nemůže reagovat na žádné nové požadavky, dokud vlákno nebude vydáno.

    Poznámka:

    Náprava v tomto případě je "Nesynchronně čekat na monitory, události, úlohu nebo jakékoli jiné objekty, které mohou blokovat vlákno. Podívejte se, jestli můžete aktualizovat metodu tak, aby byla asynchronní.".

Moje další práce je najít tento problematický kód.

  1. Kliknutím na odkaz Zobrazit zásobník volání sady Visual Studio se okamžitě přepne na vlákna, která toto chování vykazují.

  2. V okně Zásobník volání se zobrazí metody, které by mohly potenciálně rychle rozlišovat mezi mým kódem (SyncOverAsyncExmple.) z kódu frameworku (System.).

    Diagnostics analyzers link to call stack

  3. Každý rámec zásobníku volání odpovídá metodě a poklikáním na rámce zásobníku visual Studio přejde na kód, který vedl přímo k tomuto scénáři v tomto vlákně.

  4. V tomto příkladu nejsou žádné symboly ani kód, ale na stránce Symboly, které nejsou načteny, můžete vybrat možnost Dekompil zdrojový kód.

    Decompilation

  5. V dekompilované zdroji níže je zřejmé, že asynchronní úloha (ConsumeThreadPoolThread) volá synchronní blokující funkci.

    Poznámka:

    Metoda DoSomething() obsahující metodu WaitHandle.WaitOne, která blokuje aktuální vlákno fondu vláken, dokud neobdrží signál.

    Aby se zlepšila rychlost odezvy aplikací, je důležité odebrat blokující synchronní kód ze všech asynchronních kontextů.

    Analyze decompiled code