我正在使用 MDBG 示例制作托管 .NET 调试器。
目前,我正在努力解决 StepInto 行为,而 StepOut 和 StepOver 似乎有效。
实现Just-My-Code
迈步我在呼唤SetJMCStatus
在模块加载时。这工作得很好,让我可以调试我的代码。
但由于我将整个模块设置为 JMC,一些自动生成的代码开始发挥作用并破坏单步执行。此类代码的一个示例是自动属性。
由于调试器正在执行 Il 指令,因此通过单步执行,我将进入自动生成的内部get_propertyName
and set_propertyName
方法,它们被标记为我的代码,因为它们是我的模块的一部分。
为了将此类自动生成的代码与我的代码区分开来,我可以使用调试符号,而在自动生成的代码中则缺少这些符号。然后我可以简单地将方法标记为不是我的代码,以便在单步执行期间跳过它。
问题是我不知道在单步执行之前哪些方法是自动生成的。当我进入一个没有调试符号的方法时,我可以将其标记为不是我的代码,但为时已晚 - 调试器停止在它不应该停止的地方。
理论上,我可以使用 IMetadataImport 迭代我的模块方法,并在调试器启动时设置它们的 JMCStatus,但这似乎相当昂贵:
foreach (var methodToken in mdbgModule.Importer.EnumerateAllMethodTokens()) {
var func = mdbgModule.GetFunction(methodToken);
if (func.SymMethod == null)
func.CorFunction.JMCStatus = false;
}
如果我知道接下来要执行什么函数,那么我就能够设置它的状态并防止第一次单步执行自动生成的代码。
我坚持使用 MDBG 方法进行单步执行,不改变任何内容,只是在需要的地方调用 SetJMCStatus,所以我不确定提供任何代码是否有意义...如果是这样,我将编辑问题,只需添加一条评论!
任何有关主题的建议将不胜感激!
Regards,