问题标签 [mdbg]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
253 浏览

c# - mdbg 是否支持条件断点?

我正在调试一个用 C# 编写的“Hello World”程序mdgb,但似乎gdb无法设置 -style 条件断点mdbg,例如

TODO:修复图像

这是相关的语法,但我仍然不知道如何在 mdbg 中设置条件断点,尽管我阅读了mdbg 文档 [MSDN]

TODO:修复图像

那么cond 1 sum>100mdbg 中有什么?

如何有条件地设置断点?

编辑 1 @ThomasWeller 你的 when 子句在语法上是正确的,但它似乎不是一个条件断点,因为g再次命中断点,并且 when 子句不起作用,如果它起作用,g 应该在 sum 大于 100 时中断,但是在当 sum 为 1 时,事实g就打破了,远小于 100 :(

编辑 2 when BreakpointHit 1 do echo sum>100不起作用

0 投票
1 回答
603 浏览

pdb-files - 如何使用 mdbg 将 pdb 文件转换为 xml?

如何将 PDB 文件转换为 XML 文件?我从下面尝试了源代码,但它以 exe 作为输入。有没有可用的开源转换器?

0 投票
1 回答
360 浏览

debugging - 使用 MDbgEng 从内存中读取对象

我想帮助@mark在他要求 API 从 .NET 故障转储文件中转储许多对象的问题中。

因此,我使用 编写了以下代码mdbgeng,但不幸的是,它NotImplementedException在尝试枚举内存中的对象时失败了。

我使用的转储是具有完整内存的 .NET 4.6.1076.0 转储(您可以将文件名作为参数传递):

我怀疑这与丢失mscordacwks或类似情况有关,因为我刚刚在同一台机器上创建了转储,使用的 .NET 框架与我用于此示例的相同。

它真的还没有实现,还是我做错了什么?

0 投票
1 回答
170 浏览

c# - 使用 IMetaDataImport EnumMethods 获取基类层次结构方法

我正在尝试实现查看 MDBG 示例的托管调试器。

MDBG 能够解析给定范围内的函数名称,但它没有考虑基类。

MDBG 正在这样做:

虽然 Type.GetMethods() 被覆盖并具有此实现,但使用 IMetaDataImport.EnumMethods:

问题是m_importer.EnumMethods()枚举表示指定类型的方法的 MethodDef 标记,但我对类层次结构中的所有方法感兴趣。

如何获取类层次结构中定义的所有方法?(显然,不能使用反射等常用方法,因为我正在分析其他进程中定义的类型)

我对互操作和深层 CLR/CIL 结构的了解有限,这阻碍了我找到正确的方法。

欢迎任何意见/建议!

问候,

0 投票
1 回答
135 浏览

c# - 多态类的函数评估

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

MDBG 示例仅对给定实例的顶级类进行操作,而不是在类层次结构内部进行深入搜索。我能够通过层次结构并获得所有可用的方法。但是在这种情况下会出现问题:

问题是当我将 castedToBase 作为 ICorDebugValue 并查询它的 ICorDebugValue2::GetExactType 时,我得到的是 A 类而不是 Base 类。那时我无法再区分调用哪个方法 get_SomeProp 了。我希望 ICorDebugValue2::GetExactType 考虑执行的强制转换,而不总是返回底层类型。

我如何理解我应该调用哪种方法?

下面列出了我现在正在做的一些代码。mdbgValue表示 castedToBase 对象。szTypedef 返回“A”而不是预期的“Base”

0 投票
1 回答
149 浏览

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

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

目前我正在努力解决 StepInto 的行为,而 StepOut 和 StepOver 似乎可以工作。

为了实现Just-My-Code步进,我正在调用SetJMCStatus模块加载。这很好用,让我只调试我的代码。

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

由于调试器正在执行 Il 指令,因此我进入了自动生成的方法get_propertyNameset_propertyName方法,这些方法被标记为我的代码,因为它们是我的模块的一部分。

为了将这种自动生成的代码与我的代码区分开来,我可以使用调试符号的存在,在自动生成代码的情况下会丢失这些符号。然后我可以简单地将方法标记为不是我的代码,以便在步进期间跳过它。

问题是我不知道在步进过程中进入内部之前会自动生成哪些方法。当我进入一个没有调试符号的方法时,我可以将其标记为不是我的代码,但为时已晚 - 调试器在它不应该停止的地方停止了。

从理论上讲,我可以使用 IMetadataImport 迭代我的模块方法,并在调试器启动时设置它们的 JMCStatus,但这似乎相当昂贵:

如果我知道接下来要执行什么函数,那么我将能够设置它的状态并防止第一次进入自动生成的代码。

我坚持使用 MDBG 方法进行步进,不更改任何内容,只是在需要的地方调用 SetJMCStatus,所以我不确定提供任何代码是否有意义......如果是这样,我将编辑问题,只需添加一条评论!

非常感谢您对主题的任何建议!

问候,

0 投票
0 回答
336 浏览

c# - 托管的 .NET 调试器和异步/等待方法

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

考虑一些简单的异步示例:

用我的调试器调试这段代码我遇到了两个主要问题:

  1. 局部变量名称已更改(CS$4$0000、CS$0$0001 等)或丢失(在调试器的局部变量中找不到 obj)
  2. 步进行为不可预测: a) 越过第 3 行等通常应在等待评估完成后转到第 4 行。但调试器改为跳转到第 13 行并从那里继续执行。视频上的 StepOver 行为

    b) Stepping In第 3 行等等应该只踩在每一行:第 3 行 -> 第 12 行 -> 第 13 行(暂停一段时间) -> 第 14 行 -> 第 15 行 -> 第 4 行。但是在步进之后在第 13 行,我希望调试器等待评估结果,由于某种原因,步进继续到第 3 行。之后调试器等待结果并按预期继续执行。视频上的 StepIn 行为

    c)如果在等待响应时安排了其他一些工作,调试器将切换到该代码。例如,如果在等待响应期间有某个计时器超时,则在第 13 行之后继续对该计时器代码进行评估。相反,就像 Visual Studio 一样,我希望调试器能够坚持它的当前范围,并且在它完全执行之前不要离开它。视频上的并行行为

我部分理解了这些问题的根源:编译器创建了一个由嵌套结构表示的状态机,其中逻辑封装在 MoveNext 方法中。这至少解释了为什么步进不像我对案例 a) 和 b) 所期望的那样工作。当我进入一些没有符号的代码时(并且我没有编译器生成的代码的符号),我正在执行一个或多个步骤来获取我的一些代码。这是@Brian Reichle 在这个相关问题中建议的解决方案

关于局部变量名称的更改,我认为这是由于Stack Spilling("What'staking" chapter)而发生的。但是使用 ILDASM 分析我的程序集时,我没有发现任何保存到生成结构的 t__stack 字段中的内容。所以我猜不到为什么变量名没有为异步方法保留。

尽管如此,VisualStudio 还是以某种方式避免了所有这些问题。

那么托管的 .net 调试器应该如何处理异步/等待场景中的步进和局部变量解析呢?

这背后有很多实现代码,但我不确定显示哪一部分是合理的......

0 投票
1 回答
511 浏览

clr - 如何调用 ICorDebug

在“MDbg Sample.zip”项目中,从 COM 模块调用函数: [ComImport, Guid("3D6F5F61-7538-11D3-8D5B-00104B35E7EF"), InterfaceType((short) 1)] public interface ICorDebug { ...问题是在哪里可以找到 Guid("3D6F5F61-7538-11D3-8D5B-00104B35E7EF"),我在 regedit 中找不到它,但是如何将 ICoreDebug 接口与 COM 模块连接?

0 投票
1 回答
299 浏览

c# - Roslyn:给定一个源位置/行,如何确定是否可以设置断点以及在何处设置断点

我正在使用 Roslyn 和 MDbg 进行代码编辑器的调试。

在编辑器中,我的目标是设置断点的类似 Visual Studio 的行为。也就是说,用户可以点击一条线,我需要弄清楚

  1. 那是我可以实际设置断点的源位置吗?
  2. 如果是,应该在哪一行设置断点?

例如,假设用户有一个像这样的文档:

单击第 1 行时,什么都不会发生 - 不能真正在 using 语句上设置断点。

单击第 3 行时,它应该在第 4 行设置断点(不能在方法定义本身上设置断点,而是在方法执行开始的开始大括号标记处设置断点)。

单击第 7、8 或 9 行时,应在第 7 行设置断点,因为这只是一个语句。

老实说,目前我什至根本不知道如何解决这个问题..有人有任何关于如何在概念上解决这个问题的指示吗?我希望 Roslyn 可能有一些有用的辅助方法,但我在它与断点相关的源代码中没有找到太多

再说一遍,我认为的基本问题归结为弄清楚

  1. 代码中的某一行是我可以实际设置断点的位置吗?
  2. 如果是,应该在哪一行设置断点?

谢谢!

0 投票
0 回答
78 浏览

c# - MDbg / ICorDebug:什么是“OnExceptionInCallback”?

我正在使用 MDbg 编写自定义调试器以在 Excel 中调试基于 ExcelDna 的 C# AddIn。换句话说,我在 Excel 中加载了一个 Excel 插件,然后将我的自定义基于 MDbg 的调试器附加到 Excel。

今天早些时候,CorProcess (-> Excel) 触发了几次“OnExceptionInCallback”。我试图找出原因。

我无法识别任何模式,对我来说,这似乎是随机发生的,我相信即使有时我自己的 AddIn 甚至在调用此异常处理程序时根本没有运行任何代码。所以我假设这可能是由 Excel 内部的某些东西触发的,而不是我的特定插件。

不幸的是,在过去的两个小时里,我一直在尝试重现这一点,但到目前为止,它根本没有发生,因为没有对代码库进行任何相关的更改。

MDbg 在触发时暂停一个进程,忽略通常的异常设置(例如 MDbgEngine.Options.StopOnException) - 所以直觉告诉我这不是某种可以忽略的正常调试事件吗?

长话短说:有人知道 CorProcess.OnExceptionInCallback 事件代表什么吗?在什么情况下会触发这个,在被调试者中发生了什么会触发这个被触发?