hogy a műszerezés nem könnyen lehetséges az IL utasítások JIT általi összeállítása miatt.
Nos, valójában éppen ellenkezőleg. A nyomkövetési módszerek meglehetősen egyszerűek - nehéz lenne, ha szeretnénk nyomon követni a mezők használatát. A .NET-összeállítások gazdag típusú / módszer információkat tartalmaznak, amelyek felhasználhatók ellenőrzésükre / módosításukra. Van egy remek könyvtár is, amely ezt teszi, plusz még sok más - Mono.Cecil.
Azzal a segítséggel, hogy ez a könyvtár elérhesse azt, amit szeretne ( lényeg ).
a System használatával; a System.IO használatával; a System.Linq használatával; a Mono.Cecil használatával; a Mono.Cecil.Cil használatával; TraceIL osztály if (args.Length! = 1) {Console.WriteLine ("TraceIL.exe <assembly>"); Visszatérés; } string fileName = args [0]; ModuleDefinition module = ModuleDefinition.ReadModule (fileName); MethodReference consoleWriteLine = module.ImportReference (typeof (Console) .GetMethod ("WriteLine", új Type [] {typeof (object)})); foreach (TypeDefinition type in module.Types) {foreach (var methodDefinition in type.Methods) {var ilBody = methodDefinition.Body; var ilProcessor = ilBody.GetILProcessor (); var firstOp = methodDefinition.Body.Instructions.First (); var ldstrEntering = Instruction.Create (OpCodes.Ldstr, $ "- A {methodDefinition.Name}" megadása); ilProcessor.InsertBefore (firstOp, ldstrEntering); var call = Instruction.Create (OpCodes.Call, consoleWriteLine); ilProcessor.InsertBefore (firstOp, call); var ldstrLeaving = Instruction.Create (OpCodes.Ldstr, $ "- {methodDefinition.Name}" elhagyása); var lastOp = methodDefinition.Body.Instructions.Last (); ilProcessor.InsertBefore (lastOp, ldstrLeaving); ilProcessor.InsertBefore (lastOp, call); }}
module.Write (Path.GetFileNameWithoutExtension (fileName) + ". módosított" + Path.GetExtension (fileName)); }}
Csak azért, hogy egy kicsit elmagyarázzam, mi történik. Az összeállításban megtalálható minden típusú módszerhez megkapjuk az ILProcessor
-ot, amely lehetővé teszi számunkra a kód módosítását. Ennek meglétével csak be kell illesztenünk egy karakterláncot és egy hívást a Console.WriteLine
-be, közvetlenül az első létező opcode és hasonló kód elé, közvetlenül a módszer vége előtt. A legvégén ugyanazon a néven mentjük az új bináris fájlt, a .modified
hozzáadásával.
A példa futtatása:
λ TestApp.exe
Inside Run
Inside Inside
MoreInside
OtherProgramRun
λ TraceIL.exe TestApp.exe
λ TestApp.modified. exe
- A fő bevitele
- A .ctor bevitele
- A .ctor elhagyása
- A futás megadása
Belső futás
- A belső beírása Inside Inside
- MoreInside bevitele
MoreInside
--Beírása .ctor
--Leaving .ctor
--EgyébProgramFuttatás
OtherProgramRun - Leave OtherProgramRun
- Leave MoreInside
- Leave Inside
- Leave Run
- Leave Main
Természetesen az űrlapból meg lehet csinálni őrült dolgokat, például hozzáadni az időbélyegzőt és / vagy az átadott argumentumokat stb. módosítani kell szükséges.