Megosztás:


Forráskód létrehozása .NET-szerelvényekből hibakeresés közben

A .NET-alkalmazások hibakeresésekor előfordulhat, hogy meg szeretné tekinteni a nem használt forráskódot. Például egy kivétel feltörése vagy a hívásverem használata a forráshelyre való navigáláshoz.

Jegyzet

  • A forráskód létrehozása (decompilation) csak .NET-alkalmazásokhoz érhető el, és a nyílt forráskódú ILSpy projekten alapul.
  • A felbontás csak a Visual Studio 2019 16.5-ös és újabb verzióiban érhető el.
  • A SuppressIldasmAttribute attribútum szerelvényre vagy modulra való alkalmazása megakadályozza, hogy a Visual Studio megkísérelje a felbontást. Bár az attribútum elavult a .NET 6-os és újabb verzióiban, a Visual Studio tiszteletben tartja az attribútumot.

Forráskód létrehozása

Ha hibakeresést végzett, és nem érhető el forráskód, a Visual Studio megjeleníti a Forrás nem található dokumentumot, vagy ha nem rendelkezik szimbólumokkal a szerelvényhez, a Nincs szimbólum betöltve dokumentumot. Mindkét dokumentum rendelkezik egy forráskód dekompilálási opcióval, amely C# kódot hoz létre az aktuális helyhez. A létrehozott C#-kód ezután ugyanúgy használható, mint bármely más forráskód. Megtekintheti a kódot, megvizsgálhatja a változókat, töréspontokat állíthat be stb.

Nincsenek betöltött szimbólumok

Az alábbi ábrán a Nincs szimbólum betöltve üzenet látható.

Képernyőkép a szimbólum nélkül betöltött dokumentumról

A forrás nem található

Az alábbi ábrán a Forrás nem található üzenet látható.

A forrás nem található dokumentum képernyőképe

Automatikusan visszafejtett kód

A Visual Studio Debugger a Visual Studio 2022 17.7-es verziójától kezdve támogatja a külső .NET-kód automatikus lefordítását. A külső kódba való bejelentkezéskor vagy a Hívásverem ablak használatakor automatikusan megadhatja azokat.

Ha külsőleg implementált kódba lép, a hibakereső automatikusan lebontja azt, és megjeleníti az aktuális végrehajtási pontot. Ha külső kódba szeretne lépni, tiltsa le Csak saját kód.

A Hívásverem ablakból a Just My Code letiltása nélkül bonthatja le a kódot.

Automatikus dekompilálás a Hívásverem ablakában:

  1. Miközben a Hívásverem ablakban hibakeresést végzett, válassza a Külső kód megjelenítéselehetőséget.

  2. A Hívásverem ablakban kattintson duplán bármelyik veremkeretre. A hibakereső lebontja a kódot, majd közvetlenül az aktuális végrehajtási pontra navigál.

    A Hívásverem ablak képernyőképe, amely külső kódot jelenít meg.

    Az összes lefordított kód a Megoldáskezelő Külső források csomópontja alatt is megjelenik, így szükség esetén egyszerűen tallózhat a külső fájlok között.

    A külső források csomópont képernyőképe, amelyen a bontott szerelvények láthatók.

    Hibakeresést végezhet a bontott kódban, és töréspontokat állíthat be.

A külső kód automatikus felbontásának letiltása:

  1. Nyissa meg az Eszközök>beállításai panelt, és bontsa ki a Minden beállítás>hibakeresése általános szakaszt>.

  2. A jobb oldali panelen törölje a jelölést az Automatikusan a forráshoz való visszafejtés (csak felügyelt) jelölőnégyzetből.

  1. Nyissa meg az Eszközök>beállításai párbeszédpanelt, és bontsa ki azÁltalános>.

  2. A jobb oldali panelen törölje a jelölést az Automatikusan a forráshoz való visszafejtés (csak felügyelt) jelölőnégyzetből.

  3. Kattintson az OK gombra.

Források létrehozása és beágyazása egy szerelvényhez

Amellett, hogy forráskódot hoz létre egy adott helyhez, létrehozhatja egy adott .NET-szerelvény összes forráskódját. Ehhez nyissa meg a Modulok ablakot, majd a .NET-szerelvény helyi menüjét, majd válassza a Decompile Source to Symbol File parancsot. A Visual Studio létrehoz egy szimbólumfájlt a szerelvényhez, majd beágyazza a forrást a szimbólumfájlba. Egy későbbi lépésben kinyerheti a beágyazott forráskódot.

A modulok ablakában található összeállítás helyi menüjének képernyőképe a forráskód visszafejtése parancsot tartalmazza.

A beágyazott forráskód kinyerése és megtekintése

A Modulok ablak helyi menüjének Forráskód kinyerése parancsával kinyerheti a szimbólumfájlba beágyazott forrásfájlokat.

A modulok ablakában található összeállítás helyi menüjének képernyőképe a Források kinyerése paranccsal.

A kicsomagolt forrásfájlok hozzáadódnak a megoldásban egyéb fájlokként. A Különböző fájlok funkció alapértelmezés szerint ki van kapcsolva a Visual Studióban. Ha a funkció nincs engedélyezve, nem nyitható meg a kinyert forráskód.

A funkciót az Eszközök>beállításai menüben engedélyezheti.

  1. Nyissa meg az Eszközök>beállításai panelt, és bontsa ki az Összes beállítás>környezeti>dokumentuma szakaszt .

  2. A jobb oldali panelen jelölje be a Különböző fájlok megjelenítése jelölőnégyzetet, vagy törölje a jelölését a Megoldáskezelőben .

    Ha ezt a lehetőséget választja, megadhatja a Különböző fájlok projektben mentett elemek számát.

    Képernyőkép arról, hogyan konfigurálható a Különböző fájlok megjelenítése a Visual Studióban a Megoldáskezelőben.

  3. A módosítások alkalmazásához indítsa újra a Visual Studiót.

  1. Nyissa meg az Eszközök>beállításai párbeszédpanelt, és bontsa ki a Környezeti>dokumentumok szakaszt .

  2. A jobb oldali panelen jelölje be a Különböző fájlok megjelenítése jelölőnégyzetet, vagy törölje a jelölését a Megoldáskezelőben .

    Ha ezt a lehetőséget választja, megadhatja a Különböző fájlok projektben mentett elemek számát.

    Képernyőkép az Eszközök beállításlapról, amelyen engedélyezve van a különböző fájlok beállítás.

  3. Kattintson az OK gombra.

A kinyert forrásfájlok a Megoldáskezelőkülönböző fájljaiban jelennek meg.

A megoldáskezelő képernyőképe különböző fájlokkal.

A .NET-kódtárak vagy a SourceLinkhez engedélyezett NuGet-csomagok esetében a forráskódba lépve töréspontokat állíthat be, és használhatja a hibakereső összes funkcióját. További információ: Hibakeresés és diagnosztika engedélyezése a Source Link és A hibakeresési idő termelékenységének javítása a SourceLinkhasználatával.

Ismert korlátozások

A felbontás korlátozásai

A .NET-szerelvényekben használt köztes formátumból (IL) származó forráskód létrehozása bizonyos eredendő korlátozásokkal rendelkezik. Így a létrehozott forráskód nem hasonlít az eredeti forráskódra. A legtöbb különbség olyan helyeken van, ahol az eredeti forráskód információira futásidőben nincs szükség. Például futásidőben nincs szükség olyan információkra, mint a szóköz, a megjegyzések és a helyi változók neve. Javasoljuk, hogy a létrehozott forrást használja a program végrehajtásának megértéséhez, és ne az eredeti forráskód pótlásaként.

Optimalizált vagy kiadott összeállítások hibakeresése

Ha olyan kódot dekompilál, amelyet egy fordítóoptimalizálással összeállított assembly-ből generáltak, a következő problémákkal találkozhat:

  • Előfordulhat, hogy a töréspontok nem mindig kötődnek a megfelelő forráshelyhez.
  • Előfordulhat, hogy nem mindig sikerül a megfelelő helyre lépni.
  • Előfordulhat, hogy a helyi változók neve nem pontos.
  • Előfordulhat, hogy egyes változók nem érhetők el a kiértékeléshez.

További részletek a következő GitHub-probléma kapcsolatban találhatók: ICSharpCode.Decompiler integrációja a VS Debugger-be.

A felbontás megbízhatósága

A felbontási kísérletek viszonylag kis százaléka okozhat meghibásodást. Ezt a viselkedést az ILSpy szekvenciapont nullhivatkozási hibája okozza. A hibát úgy enyhítettük, hogy elfogtuk ezeket a problémákat, és simán megszakítottuk a dekompilálási kísérletet.

További részletek a következő GitHub-probléma kapcsolatban találhatók: ICSharpCode.Decompiler integrációja a VS Debugger-be.

Korlátozások aszinkron kóddal

Az aszinkron/várakozási kódmintákkal rendelkező modulok felbontásából származó eredmények hiányosak vagy teljes mértékben sikertelenek lehetnek. Az aszinkron/várakozási és hozamállapotú gépek ILSpy-implementációja csak részben van implementálva.

További részletek a GitHub-problémában találhatók: PDB Generator status.

Saját kód

A Just My Code (JMC) beállítás lehetővé teszi a Visual Studio számára, hogy átlépjen a rendszeren, a keretrendszeren, a kódtáron és más nem használaton kívüli hívásokon. A hibakeresési munkamenet során a Modulok ablakban látható, hogy a hibakereső mely kódmodulokat kezeli saját kódként (felhasználói kód).

Az optimalizált vagy kiadási modulok felbontása nem használt kódot eredményez. Ha a hibakereső megáll a visszafejtett, nem felhasználói kódban, például megjelenik a Nincs forrás ablak. Az Eszközök> vagy Hibakeresési> menüben letilthatja a Just My Code funkciót.

Nyissa meg az Eszközök>beállításai panelt, és bontsa ki a Minden beállítás>hibakeresése általános szakaszt>. Törölje a jelet a Csak saját kód engedélyezése jelölőnégyzetből.

Nyissa meg az Eszközök>beállításai párbeszédpanelt, és bontsa ki azÁltalános>. Törölje a jelet a Csak saját kód engedélyezése jelölőnégyzetből.

Kinyert források

A szerelvényből kinyert forráskódra a következő korlátozások vonatkoznak:

  • A létrehozott fájlok neve és helye nem konfigurálható.
  • A fájlok ideiglenesek, és a Visual Studio törli őket.
  • A fájlok egyetlen mappába kerülnek, és az eredeti források által használt mappahierarchiát nem használják.
  • Az egyes fájlok fájlneve tartalmazza a fájl ellenőrzőösszeg-kivonatát.

A létrehozott kód csak C# nyelven van

A dekompiláció csak forráskódfájlokat hoz létre a C#-ban. Más nyelven nem lehet fájlokat létrehozni.