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 je možné nakonfigurovat spustitelnou bitovou kopii pro ladění nastavením přepínačů IDE nebo parametrů 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 se pak zkompiluje JIT, těsně před spuštěním do nativního strojového kódu. Stejně jako u nespravovaného kódu je možné nakonfigurovat spustitelnou bitovou kopii pro ladění nastavením přepínačů IDE nebo parametrů 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 bude zapotřebí změnit chování kompilátoru JIT tak, aby bylo možné strojový kód, který generuje, snadněji ladit. Například může být třeba generovat informace o sledování JIT pro sestavení prodejní verze nebo pro optimalizaci řízení. To lze provést pomocí inicializačního souboru (.ini).

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

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

Hodnotu každé možnosti lze nastavit na 0 nebo 1 a chybějící možnost bude mít výchozí hodnotu 0. Nastavení volby GenerateTrackingInfo na hodnotu 1 a volby AllowOptimize na hodnotu 0 poskytuje nejjednodušší ladění.

Počínaje rozhraním .NET Framework 2.0 kompilátor JIT vždy generuje informace o sledování bez ohledu na hodnotu , GenerateTrackingInfoAllowOptimize ale hodnota stále má vliv. Při použití Ngen.exe (Generátor nativních imagí) k předkompilování nativní bitové kopie bez optimalizace musí být soubor .ini v cílové složce při AllowOptimize=0 spuštění Ngen.exe. Pokud jste sestavení předkompilovali bez optimalizace, je nutné předkompilovaný kód předkompilovat pomocí možnosti NGen.exe /uninstall před opětovným spuštěním Ngen.exe předkompilovat kód jako optimalizovaný. Pokud soubor .ini ve složce není, Ngen.exe kód předkompiluje jako optimalizovaný.

System.Diagnostics.DebuggableAttribute určuje nastavení sestavení. DebuggableAttribute obsahuje dvě pole, která řídí, jestli 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, nejsnadnější ladění kódu počítače. Povolením JIT sledování se snižuje výkon a vypnutím optimalizace se výkon razantně snižuje.

DebuggableAttribute se vztahuje na celé sestavení najednou, ne 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 propaguje tyto atributy 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 , když jsou zadány možnosti kompilátoru /clr a /Zi . Ve verzi 1.1 rozhraní .NET Framework musíte buď přidat debuggableAttribute ručně do kódu, nebo použít /ASSEMBLYDEBUG linker možnost.

Viz také