Megosztás a következőn keresztül:


Kép könnyebb hibakeresése a .NET-ben

Megjegyzés:

Ez a cikk a .NET-keretrendszerre vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A nem felügyelt kód összeállításakor konfigurálhat egy végrehajtható lemezképet hibakeresésre az IDE-kapcsolók vagy a parancssori beállítások beállításával. A Visual C++ /Zi parancssori beállításával például megkérheti, hogy küldjön hibakeresési szimbólumfájlokat (fájlkiterjesztés .pdb). Hasonlóképpen, a /Od parancssori beállítás arra utasítja a fordítót, hogy tiltsa le az optimalizálást. Az eredményül kapott kód lassabban fut, de könnyebb hibakeresést végezni, ha erre szükség van.

A .NET-keretrendszer által felügyelt kód összeállításakor a fordítók, például a Visual C++, a Visual Basic és a C# lefordítják a forrásprogramjukat a közös köztes nyelvre (CIL). A CIL-t ezután a végrehajtás előtt közvetlenül JIT-fordítják natív gépi kóddá. A nem felügyelt kódhoz hasonlóan a futtatható rendszerképeket is konfigurálhatja hibakeresésre ide-kapcsolók vagy parancssori beállítások beállításával. A JIT-fordítást ugyanúgy konfigurálhatja a hibakereséshez.

Ennek a JIT-konfigurációnak két aspektusa van:

  • Kérheti a JIT fordítót, hogy hozzon létre nyomkövetési információkat. Ez lehetővé teszi, hogy a hibakereső a CIL-láncot a gépi kód megfelelőjéhez társítsa, és nyomon kövesse, hol helyezkednek el a helyi változók és függvényargumentumok. A .NET-keretrendszer 2.0-s és újabb verzióiban a JIT-fordító mindig nyomkövetési információkat hoz létre, ezért nem kell kérnie.

  • Kérheti a JIT-fordítót, hogy ne optimalizálja az eredményként kapott gépkódot.

A CIL-t létrehozó fordító általában megfelelően állítja be ezeket a JIT-fordítóbeállításokat a megadott IDE-kapcsolók vagy parancssori beállítások( például /Od) alapján.

Bizonyos esetekben érdemes lehet módosítani a JIT-fordító viselkedését, hogy az általa létrehozott gépi kód könnyebben hibakeresésre szolgáljon. Előfordulhat például, hogy JIT-nyomkövetési információkat szeretne létrehozni egy kiskereskedelmi buildhez vagy vezérlőoptimalizáláshoz. Ezt inicializálási (.ini) fájllal teheti meg.

Ha például a hibakeresni kívánt összeállítás neve MyApp.exe, akkor létrehozhat egy MyApp.ini nevű szövegfájlt ugyanabban a mappában, mint MyApp.exe, amely az alábbi három sort tartalmazza:

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

Az egyes beállítások értékét 0 vagy 1 értékre állíthatja, a hiányzó beállítások alapértelmezett értéke pedig 0. Beállítva a GenerateTrackingInfo értékét 1-re és a AllowOptimize értékét 0-ra lehetővé teszi a legegyszerűbb hibakeresést.

A .NET-keretrendszer 2.0-s verziójától kezdve a JIT-fordító mindig nyomkövetési információkat hoz létre, függetlenül attól, hogy milyen értéket használ GenerateTrackingInfo; az AllowOptimize értéknek azonban továbbra is van hatása. Ha a Ngen.exe (natív képgenerátor) segítségével előre lefordítja a natív képet optimalizálás nélkül, a .ini fájlnak jelen kell lennie a célmappában amikor AllowOptimize=0 Ngen.exe végrehajtásra kerül. Ha optimalizálás nélkül előre összeállított egy szerelvényt, el kell távolítania az előre összeállított kódot a NGen.exe /uninstall beállítással, mielőtt újra futtatja a Ngen.exe-t az optimalizált módon történő előre összeállításhoz. Ha a .ini fájl nem található a mappában, alapértelmezés szerint Ngen.exe optimalizáltként prekompilálta a kódot.

A System.Diagnostics.DebuggableAttribute vezérli a szerelvény beállításait. DebuggableAttribute két mezőt tartalmaz, amelyek azt szabályozzák, hogy a JIT-fordítónak optimalizálnia kell-e és/vagy létre kell-e hoznia a követési információkat. A .NET-keretrendszer 2.0-s és újabb verzióiban a JIT-fordító mindig nyomkövetési információkat hoz létre.

Kiskereskedelmi verzióknál a fordító nem állít be DebuggableAttribute attribútumot. Alapértelmezés szerint a JIT-fordító hozza létre a legnagyobb teljesítményt, és a gépi kód hibakeresése a legnehezebb. A JIT-nyomon követés engedélyezése egy kicsit csökkenti a teljesítményt, és az optimalizálás letiltása nagyban csökkenti a teljesítményt.

Ez DebuggableAttribute egyszerre egy teljes szerelvényre vonatkozik, nem pedig a szerelvény egyes moduljaira. A fejlesztői eszközöknek ezért egyéni attribútumokat kell csatolniuk a szerelvény metaadat-jogkivonatához, ha már létrejött egy szerelvény, vagy a System.Runtime.CompilerServices.AssemblyAttributesGoHere osztályhoz. Az ALink eszköz ezt követően előlépteti ezeket az DebuggableAttribute attribútumokat az egyes modulokból a szerelvénybe, amelyből azok részei lesznek. Ütközés esetén az ALink művelet meghiúsul.

Megjegyzés:

A .NET-keretrendszer 1.0-s verziójában a Microsoft Visual C++ fordító hozzáadja a DebuggableAttribute jelölőt, amikor a /clr és /Zi fordító beállításait adják meg. A .NET-keretrendszer 1.1-es verziójában vagy manuálisan kell hozzáadnia a DebuggableAttribute kódot, vagy a /ASSEMBLYDEBUG linker kapcsolót kell használnia.

Lásd még