是否可以在“跟踪”模式下运行 C# CLR 代码?有什么方法可以拦截 Invoke 调用吗?如何为 c# 代码编写调试器?目前唯一想到的就是模拟CLR代码的执行,但是这里需要模拟器上一大堆代码,然后……截取现成库的代码,因为有CLR- Native-CLR 桥接,所以模拟器没那么简单。我с++-cli
认为实现这个奇迹是现实的……但是……我认为有某种特殊的模式可以很容易地开启。看到已经有 VS 的“弯曲”类似物......如何在其他项目中解决这个问题?
是否可以在“跟踪”模式下运行 C# CLR 代码?有什么方法可以拦截 Invoke 调用吗?如何为 c# 代码编写调试器?目前唯一想到的就是模拟CLR代码的执行,但是这里需要模拟器上一大堆代码,然后……截取现成库的代码,因为有CLR- Native-CLR 桥接,所以模拟器没那么简单。我с++-cli
认为实现这个奇迹是现实的……但是……我认为有某种特殊的模式可以很容易地开启。看到已经有 VS 的“弯曲”类似物......如何在其他项目中解决这个问题?
如何编写调试器,或者更确切地说是跟踪器。
本文假设您具有 c++ 的基本知识。调试器可以用 C++ 编写,甚至可以用 C# 编写,但我更喜欢 C++。我将展示基础 - 如何编写示踪剂。
从哪里开始。让我们创建一个简单的c#
让我们把它捡起来
c:\windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /platform:x86 /target:1.exe 1.cs /pdb:1.pdb /debug
该工作室有一个 SDK 文件夹,您可以在其中找到必要的标头。我这里有
SDK\v2.0\include
。您将需要以下库起初我想——我会创建 CoCreateIntance,有一个 CreateProcess 函数——一切都会好起来的,但没有。
创建 ICorDebug 和 ICorProcess。如果创建了第一个,则可以轻松创建第二个。有几种方法可以创建它,我将展示其中一种。如果 mscoree.dll 链接失败,请通过 LoadLibrary 和 GetProcAddress 进行连接。有两个函数,一个检查版本,另一个创建 ICorDebug。
嗯……快完成了。或者几乎不算。我用SetManagedHandler受了很长时间,如果该功能不起作用,那么您还没有描述所有处理程序。现在让我们继续...
创建一个处理程序。在 FrameWork 2.0 版本中,事实证明需要支持两个回调。好吧,......在处理程序中写一些东西。有必要在您可以编写的任何地方将其
pAppDomain->Continue();
输入到每个处理程序中。我不会给出整个代码,我会给出主要内容。此外,我们只讨论这个处理程序。类似地 f-tion
Breakpoint
等NameChange
。函数拦截应该在一个模块中完成,如下所示:并添加一个 BreakPoint 处理程序
是的,
MGRHandler MgrHandler;
当您完成编写处理程序时,在处理程序下方添加。如果编译器发誓,它会写 wordsabstract
,error
这意味着不是所有的功能都实现了。您需要添加所有内容(现代编译器可以自己实现抽象类,如果您另外在正确的位置单击两三次)。现在调试器可以以某种方式调试程序。面对这个……哦,我的ip在哪里……
处理器升级。有一个接口
ICorDebugILFrame
——它有很多用处,局部变量、参数和ip。程序的最后一次“触摸”,我们在处理程序中编辑函数:现在我们有了一个“跟踪器”,可以让您逐步执行该功能。我没有提到
IMetaDataImport
——通过它你可以得到所有函数和参数的名称,其余的必要信息相对容易找到。我试图展示我不太容易找到的 4 个步骤。显示了一个纯粹的“骨架”。PS 测试。
该模块是用 borland c++ x86 构建的。
win2003 x86 - 模块工作(工作室 2005)
win7 x64 - 该模块可以工作,但您需要创建正在调试的程序的 32 位程序集,即 添加到
csc.exe
参数/platform:x86
(否则我们会捕获错误DebuggerError
0x80131C30)有用的链接
corerror.h
但是……不方便。