gpt4 book ai didi

c# - 调试器 StepInto 自动生成的代码和 JMC 问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:22 25 4
gpt4 key购买 nike

我正在使用 MDBG 示例制作托管 .NET 调试器。

目前我正在为 StepInto 行为苦苦挣扎,而 StepOut 和 StepOver 似乎有效。

为了实现 Just-My-Code 步进,我在模块加载时调用了 SetJMCStatus。这工作正常,允许我只调试我的代码。

但是由于我将整个模块设置为 JMC,一些自动生成的代码开始发挥作用并破坏了单步执行。此类代码的一个示例可能是自动属性。

由于调试器正在执行 Il 指令,通过 step-into 我进入了自动生成的 get_propertyNameset_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,所以我不确定提供任何代码是否有意义......如果是这样,我将编辑问题, 只需添加评论!

非常感谢任何关于主题的建议!

问候,

最佳答案

迈克·斯托尔 hinted在一个选项中,您可以为整个模块设置 JMC,然后当调试器步进器中断时,检查该方法是否可调试,如果不是,则禁用它的 JMC 状态并重新运行步进器。 (如果正在恢复的步进器需要在再次进入之前退出,我不确定这是否会导致行为发生变化。)

您可能可以通过仅为具有可用 pdb 的模块设置 JMC 并通过应用 [DebuggerNonUserCode](也可能是 [DebuggerHidden])的类/方法禁用 JMC 来改进事情。但是,与其枚举所有类/方法并检查它们是否具有该属性,不如枚举自定义属性并返回(IMetaDataImport::EnumCustomAttributes 设置了 tkType 但不设置 tk,然后使用 IMetaDataImport::GetCustomAttributeProps 获取其应用的对象)。

如果在方法级别应用 [CompilerGenerated] 属性,您也许可以做类似的事情,但在类级别应用时会得到误报(编译器将它应用到状态用于迭代器和异步方法的机器,但两者也可能有非生成代码)。

关于c# - 调试器 StepInto 自动生成的代码和 JMC 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38897784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com