Sdílet prostřednictvím


Generování zdrojového kódu ze sestavení .NET při ladění

Při ladění aplikace .NET můžete zjistit, že chcete zobrazit zdrojový kód, který nemáte. Například přerušení výjimky nebo použití zásobníku volání pro přechod do zdrojového umístění.

Poznámka:

  • Generování zdrojového kódu (dekompilace) je k dispozici pouze pro aplikace .NET a je založené na opensourcovém projektu ILSpy .
  • Dekompilace je dostupná jenom v sadě Visual Studio 2019 16.5 a novějších verzích.
  • Použití atributu SuppressIldasmAttribute u sestavení nebo modulu brání sadě Visual Studio v pokusu o dekompilace. I když je atribut zastaralý v .NET 6 a novějším, Visual Studio tento atribut respektuje.

Generování zdrojového kódu

Při ladění a není k dispozici žádný zdrojový kód, Visual Studio zobrazí dokument Zdroj nenalezeno nebo pokud nemáte symboly pro sestavení, dokument Bez symbolů načten. Oba dokumenty mají možnost dekompilovaného zdrojového kódu , která generuje kód jazyka C# pro aktuální umístění. Vygenerovaný kód jazyka C# se pak dá použít stejně jako jakýkoli jiný zdrojový kód. Kód můžete zobrazit, zkontrolovat proměnné, nastavit zarážky atd.

Nebyly načteny žádné symboly.

Následující obrázek znázorňuje zprávu Bez symbolů načtených .

Screenshot of no symbol loaded document

Zdroj nebyl nalezen.

Následující obrázek ukazuje zprávu Zdroj nenalezena .

Screenshot of source not found document

Kód automatického dokončování

Počínaje sadou Visual Studio 2022 verze 17.7 podporuje ladicí program sady Visual Studio automatické dokončování externího kódu .NET. Automatické dokončování můžete provést při krokování do externího kódu nebo při použití okna Zásobník volání.

Pokud přejdete do kódu, který byl implementován externě, ladicí program ho automaticky dekompiluje a zobrazí aktuální bod provádění. Pokud chcete přejít do externího kódu, musí být zakázán pouze můj kód .

Dekompilování můžete snadno dekompilovat z okna Zásobník volání bez zakázání pouze mého kódu.

Automatické dokončování z okna Zásobník volání:

  1. Při ladění s otevřeným oknem Zásobník volání vyberte Zobrazit externí kód.

  2. V okně Zásobník volání poklikejte na libovolný rámec zásobníku. Ladicí program dekompiluje kód a pak přejde přímo k aktuálnímu bodu provádění.

    Screenshot of Call Stack window showing external code.

    Veškerý dekompilovaný kód se také zobrazuje v uzlu Externí zdroje v Průzkumník řešení, aby bylo možné v případě potřeby snadno procházet externí soubory.

    Screenshot of External Sources node showing decompiled assemblies.

    Dekompilovaný kód můžete ladit a nastavit zarážky.

Pokud chcete zakázat automatické dekompilace externího kódu, přejděte do >části Nástroje Možnosti > ladění > Obecné a v případě potřeby zrušte výběr možnosti automatického dekompilu pro zdroj (jenom spravované).

Generování a vkládání zdrojů pro sestavení

Kromě generování zdrojového kódu pro konkrétní umístění můžete vygenerovat veškerý zdrojový kód pro dané sestavení .NET. Chcete-li provést tuto úlohu, přejděte do okna Moduly a z místní nabídky sestavení .NET a pak vyberte příkaz Decompile Source to Symbol File . Visual Studio vygeneruje soubor symbolů pro sestavení a potom vloží zdroj do souboru symbolů. V pozdějším kroku můžete extrahovat vložený zdrojový kód.

Screenshot of assembly context menu in modules window with decompile source command.

Extrahování a zobrazení vloženého zdrojového kódu

Zdrojové soubory vložené do souboru symbolů můžete extrahovat pomocí příkazu Extrahovat zdrojový kód v místní nabídce okna Moduly .

Screenshot of assembly context menu in modules window with extract sources command.

Extrahované zdrojové soubory se do řešení přidají jako různé soubory. Funkce různých souborů je ve výchozím nastavení v sadě Visual Studio vypnutá. Tuto funkci můžete povolit pomocí zaškrtávacího políčka Nástroje>Možnosti>prostředí>Dokumenty>zobrazit různé soubory v Průzkumník řešení. Pokud tato funkce není povolená, nemůžete otevřít extrahovaný zdrojový kód.

Screenshot of tools option page with miscellaneous files option enabled.

Extrahované zdrojové soubory se zobrazují v různých souborech v Průzkumník řešení.

Screenshot of solution explorer with miscellaneous files.

Pro knihovny .NET nebo pro balíčky NuGet povolené pro SourceLink můžete také krokovat se zdrojovým kódem, nastavit zarážky a používat všechny funkce ladicího programu. Další informace najdete v tématu Povolení ladění a diagnostiky pomocí odkazu na zdroj a zlepšení produktivity při ladění pomocí SourceLinku.

Známá omezení

Vyžaduje režim přerušení.

Generování zdrojového kódu pomocí dekompilace je možné pouze v případech, kdy je ladicí program v režimu přerušení a aplikace je pozastavena. Visual Studio například přejde do režimu přerušení, když se dostane na zarážku nebo výjimku. Visual Studio můžete snadno aktivovat, aby se při příštím spuštění kódu přerušil pomocí příkazu Break All (Break all icon).

Omezení dekompilace

Generování zdrojového kódu z přechodného formátu (IL), který se používá v sestaveních .NET, má určitá omezení. Vygenerovaný zdrojový kód proto nevypadá jako původní zdrojový kód. Většina rozdílů je na místech, kde informace v původním zdrojovém kódu nejsou potřeba za běhu. Například informace, jako jsou prázdné znaky, komentáře a názvy místních proměnných, nejsou potřeba za běhu. Doporučujeme použít vygenerovaný zdroj, abyste pochopili, jak se program spouští, a ne jako náhrada původního zdrojového kódu.

Ladění optimalizovaných nebo vydaných sestavení

Při ladění kódu dekompilovaného ze sestavení, které bylo zkompilováno pomocí optimalizací kompilátoru, můžete narazit na následující problémy:

  • Zarážky nemusí být vždy svázané s odpovídajícím umístěním zdroje.
  • Krokování nemusí vždy přejít na správné místo.
  • Místní proměnné nemusí mít přesné názvy.
  • Některé proměnné nemusí být k dispozici pro vyhodnocení.

Další podrobnosti najdete v problému s GitHubem: Integrace ICSharpCode.Decompiler do Ladicího programu VS.

Spolehlivost dekompilace

Relativně malé procento pokusů o dekompilace může vést k selhání. Toto chování je způsobeno chybou odkazu na bod sekvence v ilSpy. Toto selhání jsme zmírňovali zachycením těchto problémů a bezproblémovým selháním pokusu o dekompilace.

Další podrobnosti najdete v problému s GitHubem: Integrace ICSharpCode.Decompiler do Ladicího programu VS.

Omezení asynchronního kódu

Výsledky dekompilování modulů pomocí vzorů kódu async/await můžou být neúplné nebo zcela selžou. Implementace ILSpy asynchronní/await a výnos stavových počítačů je implementována pouze částečně.

Další podrobnosti najdete v problému s GitHubem: Stav generátoru PDB.

Pouze můj kód

Nastavení Just My Code (JMC) umožňuje sadě Visual Studio přejít přes systém, architekturu, knihovnu a další volání bez uživatele. Během ladicí relace okno Moduly ukazuje, které moduly kódu ladicí program považuje za Můj kód (uživatelský kód).

Dekompilace optimalizovaných nebo vydaných modulů vytváří neuživatelské kódy. Pokud ladicí program přeruší dekompilovaný neuživatelový kód, například okno Bez zdroje se zobrazí. Chcete-li zakázat pouze můj kód, přejděte na Možnosti nástrojů>(nebo Možnosti ladění>)> Ladění>Obecné a potom zrušte výběr povolit pouze můj kód.

Extrahované zdroje

Zdrojový kód extrahovaný ze sestavení má následující omezení:

  • Název a umístění vygenerovaných souborů není možné konfigurovat.
  • Soubory jsou dočasné a odstraněné sadou Visual Studio.
  • Soubory se umístí do jedné složky a do jakékoli hierarchie složek, kterou původní zdroje používaly, se nepoužívají.
  • Název souboru pro každý soubor obsahuje hodnotu hash kontrolního součtu souboru.

Vygenerovaný kód je pouze jazyk C#

Dekompilace generuje pouze soubory zdrojového kódu v jazyce C#. Neexistuje možnost generovat soubory v žádném jiném jazyce.