我正在开发一个用户模式(Ring3)代码级调试器。它还应该支持.NET可执行文件的本机(x86)调试。基本上,我需要遵循:
1).NET在隐藏模式下加载一些模块,没有LOAD_DLL_DEBUG_EVENT,甚至经常无法获取可执行文件的名称。我需要通知;
2)我还希望每次JIT编译器编译方法时都收到通知;
3)对于给定的CIL方法,我需要相应的本机CPU命令的地址;
4)堆栈遍历(托管堆栈帧的解码)也将受到赞赏。
(当然,稍后会有更多问题)。解决方案必须独立于.NET版本。有一个来自Microsoft的.NET调试API解决了问题1(部分),3和4,以及解析2的.NET分析API。
不幸的是,我在互操作模式下的调试器和.NET API并不适合。我已经有一个可靠的快速调试引擎,带有断点,内存管理等等。我的程序是一个简化的单线程应用程序。在逐步模式下,它可以以每秒500.000个命令的速度跟踪,分析和协调调试代码。
微软的解决方案完全不同。 .NET调试器是一个聪明的野兽;如果我被要求编写一个托管调试器,那将是我的第一选择。它永远不会挂起Debuggee - 只暂停.NET执行 - 因此可以调用mscoree和co。,它们在Debuggee的上下文中具有对内部结构的完全访问权限。要进行通信,它会在Debuggee中创建一个额外的线程,在Debugger中创建另一个线程。 (并且必须从另一个线程发送未处理的异常回调的Continue())!)
对我而言,这意味着我的代码,无限的关键部分,信号量,共享内存和死锁都会发生重大变化。我无法使用内存断点。如果Debuggee变得疯狂,它可能会影响助手DLL。在Debuggee的上下文中执行也可能意味着对调试器应用程序的影响太大。
是否存在一种非侵入式,与版本无关的方法来解决列出的问题?
奥利
答案 0 :(得分:6)