在调试器中正确地使.NET语言步进

时间:2011-08-04 06:42:18

标签: .net visual-studio visual-studio-2010 debugging clr

2 个答案:

答案 0 :(得分:26)

我是Visual Studio Debugger团队的工程师。

如果我错了,请纠正我,但听起来唯一的问题是当从PDB切换到.NET 4动态编译符号格式时,会遗漏一些断点。

我们可能需要一个repro来准确诊断问题,但是这里有一些可能有用的注释。

  1. VS(2008+)可以作为非管理员运行
  2. 第二次有任何符号加载吗?您可以通过中断(通过异常或调用System.Diagnostic.Debugger.Break())进行测试。
  3. 假设符号加载,是否有可以发送给我们的复制品?
  4. 可能的区别在于,动态编译代码的符号格式在.NET 2(PDB流)和.NET 4(我认为他们称之为IL DB吗?)之间有100%的差异。
  5. 'nop'关于正确的声音。请参阅下面的生成隐式序列点的规则。
  6. 您实际上不需要在不同的线路上发射物品。默认情况下,VS将执行'symbol-statements',作为编译器编写者,您可以定义'symbol-statement'的含义。因此,如果您希望每个表达式在符号文件中都是一个单独的东西,那就可以了。
  7. JIT根据以下规则创建隐式序列点: 1. IL nop说明 2. IL堆栈空点 3.紧接在调用指令之后的IL指令

    如果事实证明我们确实需要一个repro来解决您的问题,您可以提交连接错误并通过该媒介安全地上传文件。

    <强>更新

    我们鼓励遇到此问题的其他用户从http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27543尝试Dev11的开发者预览版,并对任何反馈发表评论。 (必须以4.5为目标)

    更新2:

    Leppie已经验证了此修复程序可以在http://www.microsoft.com/visualstudio/11/en-us/downloads上提供的Dev11的Beta版本上运行,如连接错误https://connect.microsoft.com/VisualStudio/feedback/details/684089/中所述。

    谢谢,

答案 1 :(得分:3)

我是SharpDevelop Debugger团队的工程师: - )

你解决了这个问题吗?

您是否尝试在SharpDevelop中调试它?如果.NET中存在错误,我想知道是否需要实现一些解决方法。我不知道这个问题。

您是否尝试在ILSpy中调试它?特别是没有调试符号。它会调试C#代码,但它会告诉我们IL指令是否可以很好地调试。 (请注意,ILSpy调试器虽然是测试版)

原始IL代码的快速说明:

  • .line 19,19:6,15''出现两次?
  • .line 20,20:7,14''不会在隐式序列点上启动(堆栈不为空)。我很担心
  • .line 20,20:7,14''包含“car x”(好)的代码以及“#f nooo x”(不好?)
  • 关于ret后的nop。那stloc,ldloc,ret呢?我认为C#使用这个技巧使ret成为一个独特的序列点。

大卫