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 brání sestavení nebo modulu v pokusu o dekompilaci sadou Visual Studio. 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 když není k dispozici žádný zdrojový kód, Visual Studio zobrazí dokument s názvem Zdroj nebyl nalezen nebo, pokud nemáte symboly pro sestavení, zobrazí dokument s názvem Nebyl načten žádný symbol. Oba dokumenty mají možnost dekompilace 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 načtených symbolů.

Snímek obrazovky s dokumentem bez načteného symbolu

Zdroj nebyl nalezen.

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

snímek obrazovky 'dokument nenalezen'

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. Automatickou dekompilaci můžete provést při vstupu do externího kódu nebo při použití okna zásobníku 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, zakažte jen můj kód.

Dekompilovat můžete z okna zásobníku volání, aniž byste museli zakázat funkci Just My Code.

Pro automatickou dekompilaci z okna Zásobníku 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í dvakrát klikněte na libovolný rámec. Ladicí program dekompiluje kód a pak přejde přímo k aktuálnímu bodu provádění.

    snímek obrazovky okna Zásobník volání s externím kódem

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

    snímek obrazovky uzlu Externí zdroje zobrazující dekompilovaná sestavení

    Dekompilovaný kód můžete ladit a nastavovat body přerušení.

Zakázání automatického dekompilace externího kódu:

  1. Otevřete panel Nástroje>Možnosti a rozbalte sekci Všechna nastavení>Ladění>Obecné.

  2. V pravém podokně zrušte zaškrtnutí políčka Automaticky dekompilovat na původní kód v případě potřeby (pouze spravované).

  1. Otevřete dialogové oknoMožnosti> a rozbalte část Ladění>Obecné.

  2. V pravém podokně zrušte zaškrtnutí políčka Automaticky dekompilovat na původní kód v případě potřeby (pouze spravované).

  3. Vyberte OK.

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, otevřete místní nabídku pro sestavení .NET a pak vyberte příkaz Dekompilovat zdroj do souboru symbolů. 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.

Snímek obrazovky místní nabídky sestavení modulů v okně s příkazem pro dekompilaci zdroje.

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.

Snímek obrazovky místní nabídky sestavení v okně modulů s příkazem pro extrakci zdrojů

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á. Pokud tato funkce není povolená, nemůžete otevřít extrahovaný zdrojový kód.

Tuto funkci můžete povolit v nabídce Možnosti nástrojů>.

  1. Otevřete podokno Nástroje>Možnosti a rozbalte oddíl Všechna nastavení>Prostředí>Dokumenty.

  2. V pravém podokně zaškrtněte nebo zrušte zaškrtnutí políčka Zobrazit různé soubory v Průzkumníku řešení .

    Pokud vyberete možnost, můžete zadat počet položek uložených v projektu Různé soubory.

    Snímek obrazovky, který ukazuje, jak v sadě Visual Studio nakonfigurovat možnost Zobrazit různé soubory v Průzkumníku řešení

  3. Pokud chcete změny použít, restartujte Visual Studio.

  1. Otevřete dialogové okno Nástroje>Možnosti a rozbalte oddíl Prostředí>Dokumenty.

  2. V pravém podokně zaškrtněte nebo zrušte zaškrtnutí políčka Zobrazit různé soubory v Průzkumníku řešení .

    Pokud vyberete možnost, můžete zadat počet položek uložených v projektu Různé soubory.

    Snímek obrazovky stránky volby nástroje s povolenou volbou Různé soubory

  3. Vyberte OK.

Extrahované zdrojové soubory se zobrazí v různých souborech v průzkumníku řešení .

snímek obrazovky Průzkumníka řešení s různými soubory

Pro knihovny .NET nebo pro balíčky NuGet povolené pro SourceLink můžete také přejít do zdrojového kódu, nastavit body přerušení a používat všechny funkce ladicího programu. Další informace najdete v tématu Povolení ladění a diagnostiky pomocí Source Link a Zlepšení produktivity při ladění pomocíSourceLink .

Známá omezení

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.
  • Krok nemusí vždy vést 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 na GitHubu: 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 nulový 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 na GitHubu: 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 stavových strojů pro async/await a yield v ILSpy je pouze částečně dokončena.

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í uživatelů. Během ladicí relace moduly okno 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živatelský kód, pak se například zobrazí okno Bez zdroje. Funkci Just My Code můžete zakázat v nabídce Nástroje>Možnosti nebo Ladění>Možnosti.

Otevřete panel Nástroje>Možnosti a rozbalte sekci Všechna nastavení>Ladění>Obecné. Zrušte zaškrtnutí políčka Povolit pouze můj kód .

Otevřete dialogové oknoMožnosti> a rozbalte část Ladění>Obecné. Zrušte zaškrtnutí políčka 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 nepoužívá se žádná hierarchie složek, kterou původní zdroje měly.
  • 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.