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ů.
Zdroj nebyl nalezen.
Následující obrázek ukazuje zprávu Zdroj nenalezena.
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í:
Při ladění s otevřeným oknem Zásobník volání vyberte Zobrazit externí kód.
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í.
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.
Dekompilovaný kód můžete ladit a nastavovat body přerušení.
Pokud chcete zakázat automatické dekompilace externího kódu, přejděte na Tools > Options > Debugging > General a zrušte výběr Automaticky dekompilovat na zdrojový kód podle potřeby (pouze 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, 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.
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.
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 v Tools>Options>Environment>Documents>Zobrazit různé soubory v Průzkumníku řešení zaškrtávací políčko. Pokud tato funkce není povolená, nemůžete otevřít extrahovaný zdrojový kód.
Extrahované zdrojové soubory se zobrazí v různých souborech v průzkumníku řešení .
SourceLink
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í
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 k přerušení při příštím spuštění kódu pomocí příkazu Break All ().
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: integraci ICSharpCode.Decompiler do VS debuggeru.
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.
Jen 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. Chcete-li zakázat pouze můj kód, přejděte na Nástroje>Možnosti (nebo Ladění>Možnosti) >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 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.