DebuggerStepInto自动生成代码和JMC问题我正在使用MDBG示例制作一个托管.NET调试器。目前我正在与StepInto行为作斗争,而StepOut和StepOver似乎也能正常工作。为了实现Just-My-Code步进,我在模块加载时调用了SetJMCStatus。这工作正常并允许我调试我的代码。但是由于我将整个模块设置为JMC,一些自动生成的代码起作用并中断了步骤。此类代码的示例可以是自动属性。因为调试器正在执行Il指令,所以我进入了自动生成的get_propertyName和set_propertyName方法,它们被标记为我的代码,因为它们是我的模块的一部分。为了区分这些自动生成的代码和我的代码,我可以使用调试符号的存在,而在自动生成的代码中则缺少这些符号。然后我可以简单地将方法标记为不是我的代码以在单步执行期间跳过它。问题是在进入之前我不知道哪些方法是自动生成的。当我进入一个没有调试符号的方法时,我可以将其标记为不是我的代码,但为时已晚-调试器在不应该停止的地方停止。理论上,我可以使用IMetadataImport迭代我的模块方法并在调试器启动时设置它们的JMCStatus,但它似乎相当昂贵:);如果(func.SymMethod==null)func.CorFunction.JMCStatus=false;如果我只知道接下来要执行什么函数,我就可以设置它的状态并防止第一次进入自动生成的代码。我坚持使用MDBG方法进行步进,不改变任何东西,只是调用SetJMCStatus,所以我不确定提供任何代码是否有意义......如果是这样,我将编辑问题并添加评论!非常感谢任何关于主题的建议!您好,MikeStall暗示了一个选项,您可以在其中为整个模块设置JMC,然后当调试器步进器中断时,检查方法是否可调试,如果不可调试,则禁用其JMC状态并重新运行步进器。(如果恢复步进器需要在再次进入之前退出,我不确定这是否会导致行为发生变化。)您可以通过仅为具有pdb可用的模块设置JMC并应用[DebuggerNonUserCode](和可能[DebuggerHidden])禁用JMC类/方法以进行改进。但不是枚举所有类/方法并检查它们是否具有该属性,而是枚举自定义属性并返回(IMetaDataImport::EnumCustomAttributes设置了tkType但没有设置tk,然后使用IMetaDataImport::GetCustomAttributeProps获取它适用的内容)。如果在方法级别应用[CompilerGenerated]属性,您可以对其执行类似的操作,但在类级别应用时会出现误报(编译器将其应用于迭代器和异步方法的状态机,但两者都可能也有非生成的代码)。以上就是C#学习教程的全部内容:调试器StepInto自动生成代码及JMC问题分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
