Sdílet prostřednictvím


Jednodušší ladění obrázku v .NET

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Při kompilaci nespravovaného kódu můžete nakonfigurovat spustitelný obrázek pro ladění nastavením přepínačů ide nebo možností příkazového řádku. Můžete například použít možnost příkazového řádku /Zi v jazyce Visual C++ a požádat ho o generování souborů se symboly ladění (přípona souboru .pdb). Podobně možnost příkazového řádku /Od říká kompilátoru, aby zakázal optimalizaci. Výsledný kód běží pomaleji, ale je jednodušší ladit, pokud by to mělo být nezbytné.

Při kompilaci spravovaného kódu rozhraní .NET Framework kompilátory, jako jsou Visual C++, Visual Basic a C#, kompilují zdrojový program do společného zprostředkujícího jazyka (CIL). CIL je následně zkompilován pomocí JIT těsně před spuštěním do nativního strojového kódu. Stejně jako u nespravovaného kódu můžete nakonfigurovat spustitelný obrázek pro ladění nastavením přepínačů ide nebo možností příkazového řádku. Kompilaci JIT můžete také nakonfigurovat pro ladění podobným způsobem.

Tato konfigurace JIT má dva aspekty:

  • Můžete požádat kompilátor JIT, aby vygeneroval informace o sledování. Díky tomu může ladicí program spárovat řetězec CIL se svým protějškem strojového kódu a sledovat, kde jsou uloženy místní proměnné a argumenty funkce. V rozhraní .NET Framework verze 2.0 a novější kompilátor JIT vždy generuje informace o sledování, takže o něj nemusíte žádat.

  • Můžete požádat kompilátor JIT, aby neoptimalizoval výsledný strojový kód.

Kompilátor, který generuje CIL, obvykle nastaví tyto možnosti kompilátoru JIT odpovídajícím způsobem na základě přepínačů IDE nebo možností příkazového řádku, které zadáte, například /Od.

V některých případech můžete chtít změnit chování kompilátoru JIT, aby byl jím generovaný strojový kód snáze laditelný. Můžete například chtít vygenerovat informace o sledování JIT pro maloobchodní sestavení nebo optimalizaci řízení. Můžete to udělat pomocí souboru inicializace (.ini).

Pokud se například sestavení, které chcete ladit, nazývá MyApp.exe, můžete vytvořit textový soubor s názvem MyApp.inive stejné složce jako MyApp.exe, který obsahuje tyto tři řádky:

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

Můžete nastavit hodnotu každé možnosti na 0 nebo 1 a jakákoli chybějící možnost má výchozí hodnotu 0. Nejjednodušší ladění poskytuje nastavení GenerateTrackingInfo na 1 a AllowOptimize na 0.

Počínaje rozhraním .NET Framework 2.0 kompilátor JIT vždy generuje informace o sledování bez ohledu na hodnotu GenerateTrackingInfo, avšak hodnota AllowOptimize má stále vliv. Při používání Ngen.exe (generátor nativních imagí) k předkompilaci nativních imagí bez optimalizace musí být soubor .ini přítomen v cílové složce, když se provádí Ngen.exe. Pokud jste sestavení předkompilovali bez optimalizace, je nezbytné odstranit existující předkompilovaný kód pomocí možnosti NGen.exe /uninstall před opětovným spuštěním Ngen.exe, aby bylo možné kód předkompilovat jako optimalizovaný. Pokud soubor .ini není ve složce, ve výchozím nastavení Ngen.exe předkompiluje kód jako optimalizovaný.

System.Diagnostics.DebuggableAttribute ovládá nastavení pro sestavení. DebuggableAttribute obsahuje dvě pole, která řídí, zda má kompilátor JIT optimalizovat a/nebo generovat informace o sledování. V rozhraní .NET Framework 2.0 a novějších verzích kompilátor JIT vždy generuje informace o sledování.

U maloobchodního sestavení kompilátor nenastavují žádné DebuggableAttribute. Kompilátor JIT ve výchozím nastavení generuje nejvyšší výkon, nejobtížněji laditelný strojový kód. Povolení jit trackingu snižuje výkon trochu a zakázání optimalizace snižuje výkon hodně.

DebuggableAttribute se vztahuje na celé sestavení jako celek, nikoli na jednotlivé moduly v rámci sestavení. Vývojové nástroje proto musí k tokenu metadat sestavení připojit vlastní atributy, pokud již bylo vytvořeno sestavení, nebo ke třídě s názvem System.Runtime.CompilerServices.AssemblyAttributesGoHere. Nástroj ALink pak tyto atributy propaguje DebuggableAttribute z každého modulu do sestavení, ze které se stanou součástí. Pokud dojde ke konfliktu, operace ALink selže.

Poznámka:

Ve verzi 1.0 rozhraní .NET Framework kompilátor Microsoft Visual C++ přidá DebuggableAttribute při zadání možností kompilátoru /clr a /Zi . Ve verzi 1.1 .NET Frameworku musíte buď přidat DebuggableAttribute ručně, nebo použít volbu linkeru /ASSEMBLYDEBUG.

Viz také