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

2024-06-11

我正在使用 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,


迈克·斯托尔hinted https://blogs.msdn.microsoft.com/jmstall/2004/12/31/how-can-i-debug-just-my-code/一种选择是,您可以为整个模块设置 JMC,然后当调试器步进器中断时,检查该方法是否可调试,如果不可调试,则禁用其 JMC 状态并重新运行步进器。 (我不确定如果恢复步进器需要在再次进入之前退出,这是否会导致行为发生变化。)

您可能可以通过仅为具有可用 pdb 的模块设置 JMC 并通过禁用类/方法的 JMC 来改进事情[DebuggerNonUserCode]应用(也许[调试器隐藏] https://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerhiddenattribute(v=vs.110).aspx也)。但不是枚举所有类/方法并检查它们是否具有该属性,而是枚举自定义属性并返回(IMetaDataImport::EnumCustomAttributes https://msdn.microsoft.com/en-us/library/ms231454(v=vs.110).aspx设置了 tkType 但未设置,然后使用IMetaDataImport::GetCustomAttributeProps https://msdn.microsoft.com/en-us/library/ms231451(v=vs.110).aspx得到它所应用的东西)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试器 StepInto 自动生成的代码和 JMC 问题 的相关文章

  • Boost 错误代码参考

    有谁知道在哪里可以找到升压错误代码的参考 特别是 异步套接字处理程序返回的错误代码 Google 和 grep 头文件已调为空 我从 Linux 上的 asio error hpp 中提取了错误值 顺便说一句 我仅使用标头 asio 而不是
  • 如何获取网络服务的状态

    如何使用 C 获取 Web 服务的状态 无论是成功完成 失败还是待处理 private void button1 Click object sender EventArgs e var url servicsURL try var myRe
  • 寻求有关 cs50“现金”问题集的 C 贪婪算法的帮助[已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 目标是创建一种算法 该算法接受输入并给出从输入中减去值 25 10 5 1 的次数的输出 代码需要以尽可能贪婪的方式执行此操作 尽可能获取最
  • ExecuteNonQueryAsync 并在 SQL 事务中提交

    我正在寻求对我创建的一段代码的帮助 我正在尝试在事务中从 C 进行异步 SQL 调用 例如我可能正在更新或删除表中的行 这是我到目前为止所拥有的 但我似乎无法找到有关在事务中执行此操作的太多信息 根据我在这里所拥有的以及到目前为止我所理解的
  • 嵌套绑定表达式

    这是一个后续问题我之前的问题 https stackoverflow com questions 2735294 templates function pointers and c0x include
  • C++ 构造函数根据参数类型调用另一个构造函数

    我有这门课 class XXX public XXX struct yyy XXX std string private struct xxx data 第一个构造函数 使用结构 很容易实现 第二 我可以将一个字符串以特定的格式分开 解析
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 使用 C 序列化 double 和 float

    如何在 C 中序列化双精度数和浮点数 我有以下用于序列化短整型 整数和字符的代码 unsigned char serialize char unsigned char buffer char value buffer 0 value ret
  • 从 pdf 和 word 文件中提取文本

    如何在 C 中从 pdf 或 word 文件中提取文本 删除粗体 图像和其他富文本格式媒体 您可以使用专为索引服务设计 由索引服务使用的过滤器 它们旨在从各种文档中提取纯文本 这对于在文档内部进行搜索非常有用 您可以将其用于 Office
  • 值类型数组如何存储在 .NET 对象堆中?

    在 NET中 诸如int之类的值类型对象存储在内存中 引用类型对象需要为引用和对象单独分配内存 并且对象存储在 NET对象堆中 而Array是在堆中创建的 那么int 等值类型的数组如何存储在堆中呢 这是否意味着值类型对象可以存储在堆中而无
  • C#:如何计算纵横比

    我对编程比较陌生 我需要根据给定尺寸 例如 axb 计算纵横比 16 9 或 4 3 我如何使用 C 来实现这一点 任何帮助将不胜感激 public string AspectRatio int x int y code am lookin
  • ofstream::operator<<(streambuf) 是一种复制文件的缓慢方法

    我需要一种跨平台 无需外部库的复制文件的方式 在我的第一遍中 我想出了 省略错误处理 char buffer LEN ifstream src srcFile ios in ios binary ofstream dest destFile
  • 为什么未命名的命名空间不等同于带有“using命名空间”声明的常规命名空间?

    A 最近的话题 https stackoverflow com questions 3673353 anonymous namespace ambiguityon SO 触发了这个 未命名的命名空间被认为等同于 namespace uniq
  • 静态成员函数中的封闭类的 C++ 类型

    我认为这是完全不可能的 但如果呢 在任何版本的 C 中 是否有可能以某种方式获取静态成员函数中封闭类的类型 class Impossible public static void Fun typedef Impossible Enclosi
  • 从高斯分布中采样随机值的最快方法是什么?

    The Box Muller 变换 http en wikipedia org wiki Box E2 80 93Muller transform 是一种从高斯分布中采样随机值的优雅且性能合理的方法 我正在寻找一种用 C 编写 清晰的更快方
  • 设置了 OFN_ALLOWMULTISELECT 标志的 GetOpenFileName()

    我正在尝试使用 GetOpenFileName 通用对话框调用来弹出打开对话框并允许用户选择多个文件 我设置了 OFN ALLOWMULTISELECT 标志 并设置了 OFN EXPLORER 因此我得到了 新样式 文件选择框 当我设置
  • 作为服务运行时,URLDownloadToFile() 将对象写入缓存中

    我有一个软件 可以将图像下载到工作目录中 然后对其进行处理以创建视频 之后 这些文件将被独立脚本删除 问题是它还将文件写入以下目录 该软件作为系统服务运行 C Windows SysWOW64 config systemprofile Ap
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • Interlocked.CompareExchange 可以抛出 NullReferenceException 吗?

    From https msdn microsoft com en us library bb297966 v vs 110 aspx https msdn microsoft com en us library bb297966 v vs

随机推荐