Broncode genereren op basis van .NET-assembly's tijdens foutopsporing
Wanneer u fouten in een .NET-toepassing opspoort, is het mogelijk dat u de broncode wilt weergeven die u niet hebt. Bijvoorbeeld het verbreken van een uitzondering of het gebruik van de aanroepstack om naar een bronlocatie te navigeren.
Notitie
- Broncode genereren (decompilatie) is alleen beschikbaar voor .NET-toepassingen en is gebaseerd op de open source ILSpy project.
- Decompilatie is alleen beschikbaar in Visual Studio 2019 16.5 en hoger.
- Het toepassen van het kenmerk SuppressIldasmAttribute op een assembly of module voorkomt dat Visual Studio decompilatie probeert uit te voeren. Hoewel het kenmerk verouderd is in .NET 6 en hoger, wordt het kenmerk in Visual Studio gehonoreerd.
Broncode genereren
Wanneer u foutopsporing uitvoert en er geen broncode beschikbaar is, wordt in Visual Studio het document Bron niet gevonden weergegeven of als u geen symbolen voor de assembly hebt, wordt het Geen symbolen geladen document weergegeven. Beide documenten hebben een decompile broncode optie waarmee C#-code voor de huidige locatie wordt gegenereerd. De gegenereerde C#-code kan vervolgens net als elke andere broncode worden gebruikt. U kunt de code bekijken, variabelen inspecteren, onderbrekingspunten instellen, enzovoort.
Geen symbolen geladen
In de volgende afbeelding ziet u het bericht Geen symbolen geladen.
Bron is niet gevonden
In de volgende afbeelding ziet u het bericht Bron niet gevonden.
Code automatisch decompileren
Vanaf Visual Studio 2022 versie 17.7 ondersteunt de Visual Studio Debugger autodecompilatie van externe .NET-code. U kunt automatisch decompileren wanneer u externe code betreedt of wanneer u het venster Aanroepstack gebruikt.
Als u code betreedt die extern is geïmplementeerd, decompileert het foutopsporingsprogramma het automatisch en wordt de huidige uitvoeringslocatie weergegeven. Als u externe code wilt gebruiken, schakelt u Just My Codeuit.
U kunt decompileren vanuit het venster Aanroepstack zonder Just My Code uit te schakelen.
Automatisch decompileren vanuit het venster Oproepstack:
Selecteer tijdens het debuggen terwijl het venster Aanroepstack open is, de optie Externe code weergeven.
Dubbelklik in het venster Aanroepstack op een stackframe. Het foutopsporingsprogramma decompileert de code en navigeert vervolgens rechtstreeks naar het huidige uitvoeringspunt.
Alle gedecompileerde code wordt ook weergegeven onder het knooppunt Externe bronnen in Solution Explorer, zodat u zo nodig eenvoudig door de externe bestanden kunt bladeren.
U kunt fouten opsporen in de ontcompileerde code en onderbrekingspunten instellen.
Als u de automatische decompilatie van externe code wilt uitschakelen, gaat u naar Extra > Opties > Foutopsporing > Algemeen en deselecteert u Automatisch decompileren naar de bron wanneer dat nodig is (alleen beheerd).
Bronnen genereren en insluiten voor een assembly
Naast het genereren van broncode voor een specifieke locatie, kunt u alle broncode voor een bepaalde .NET-assembly genereren. Als u deze taak wilt uitvoeren, gaat u naar het venster Modules en selecteert u in het contextmenu van een .NET-assembly de Decompile Source to Symbol File opdracht. Visual Studio genereert een symboolbestand voor de assembly en sluit vervolgens de bron in het symboolbestand in. In een latere stap kunt u de ingesloten broncode extraheren.
De ingesloten broncode extraheren en weergeven
U kunt bronbestanden extraheren die zijn ingesloten in een symboolbestand met behulp van de opdracht Broncode extraheren in het contextmenu van het venster Modules.
De geëxtraheerde bronbestanden worden aan de oplossing toegevoegd als diverse bestanden. De functie voor diverse bestanden is standaard uitgeschakeld in Visual Studio. U kunt deze functie inschakelen vanuit de Hulpmiddelen>Opties>Omgeving>Documenten>Toon diverse bestanden in Solution Explorer selectievakje. Als deze functie niet is ingeschakeld, kunt u de geëxtraheerde broncode niet openen.
Uitgepakte bronbestanden worden weergegeven in de diverse bestanden in Solution Explorer.
SourceLink
Voor .NET-bibliotheken of voor NuGet-pakketten die zijn ingeschakeld voor SourceLink, kunt u ook de broncode instappen, onderbrekingspunten instellen en alle functies van het foutopsporingsprogramma gebruiken. Zie Foutopsporing en diagnostische gegevens inschakelen met Source Link en De productiviteit van foutopsporingstijd verbeteren met SourceLinkvoor meer informatie.
Bekende beperkingen
Vereist onderbrekingsmodus
Het genereren van broncode met behulp van decompilatie is alleen mogelijk wanneer het foutopsporingsprogramma zich in de onderbrekingsmodus bevindt en de toepassing wordt onderbroken. Visual Studio voert bijvoorbeeld de onderbrekingsmodus in wanneer het een onderbrekingspunt of een uitzondering bereikt. U kunt Visual Studio eenvoudig aanzetten om te stoppen de volgende keer dat uw code wordt uitgevoerd, met behulp van de opdracht Alles stoppen ().
Beperkingen voor de decompilatie
Het genereren van broncode van de tussenliggende indeling (IL) die wordt gebruikt in .NET-assembly's heeft enkele inherente beperkingen. Als zodanig ziet de gegenereerde broncode er niet uit als de oorspronkelijke broncode. De meeste verschillen zijn op plaatsen waar de informatie in de oorspronkelijke broncode tijdens runtime niet nodig is. Informatie zoals witruimte, opmerkingen en de namen van lokale variabelen zijn bijvoorbeeld niet nodig tijdens runtime. U wordt aangeraden de gegenereerde bron te gebruiken om te begrijpen hoe het programma wordt uitgevoerd en niet als vervanging voor de oorspronkelijke broncode.
Debuggen van geoptimaliseerde of release-versies van assembly's
Bij het opsporen van fouten in code die is gedecompileerd vanuit een assembly die is gecompileerd met behulp van compileroptimalisaties, kunt u de volgende problemen tegenkomen:
- Onderbrekingspunten verbinden mogelijk niet altijd met de bijbehorende bronlocatie.
- Stappen worden mogelijk niet altijd naar de juiste locatie uitgevoerd.
- Lokale variabelen hebben mogelijk geen nauwkeurige namen.
- Sommige variabelen zijn mogelijk niet beschikbaar voor evaluatie.
Meer informatie vindt u in het GitHub-probleem: INTEGRATIE van ICSharpCode.Decompiler in VS Debugger.
Betrouwbaarheid van de decompilatie
Een relatief klein percentage van de decompilatiepogingen kan leiden tot een fout. Dit gedrag wordt veroorzaakt door een null-verwijzingsfout voor een reekspunt in ILSpy. We hebben de mislukking verminderd door deze problemen op te vangen en de decompilatiepoging op een beheerste manier te laten mislukken.
Meer informatie vindt u in het GitHub-probleem: INTEGRATIE van ICSharpCode.Decompiler in VS Debugger.
Beperkingen met asynchrone code
De resultaten van decompilingmodules met asynchrone/wachten-codepatronen kunnen onvolledig zijn of volledig mislukken. De ILSpy-implementatie van asynchrone/wacht- en opbrengststatusmachines wordt slechts gedeeltelijk geïmplementeerd.
Meer informatie vindt u in het GitHub-probleem: PDB-generatorstatus.
Alleen mijn code
Met de instelling Just My Code (JMC) kan Visual Studio over systeem-, framework-, bibliotheek- en andere niet-gebruikersaanroepen heen stappen. Tijdens een foutopsporingssessie toont het venster Modules welke codemodules het foutopsporingsprogramma behandelt als Mijn code (gebruikerscode).
Decompilatie van geoptimaliseerde of releasemodules produceert niet-gebruikerscode. Als de debugger vastloopt in uw gedecompileerde niet-gebruikerscode, verschijnt bijvoorbeeld het venster Geen bron. Als u Just My Code wilt uitschakelen, gaat u naar Extra>Opties (of Foutopsporing>Opties) >Foutopsporing>Algemeenen schakelt u vervolgens Just My Codeinschakelen uit.
Geëxtraheerde bronnen
Broncode die uit een assembly is geëxtraheerd, heeft de volgende beperkingen:
- De naam en locatie van de gegenereerde bestanden kunnen niet worden geconfigureerd.
- De bestanden zijn tijdelijk en verwijderd door Visual Studio.
- De bestanden worden in één map geplaatst en de maphiërarchie van de oorspronkelijke bronnen wordt niet gebruikt.
- De bestandsnaam voor elk bestand bevat een controlesomhash van het bestand.
De gegenereerde code is alleen in C#
Met decompilatie worden alleen broncodebestanden in C# gegenereerd. Er is geen optie om bestanden in een andere taal te genereren.