【问题标题】:Error when using a conditional breakpoint on System.Type在 System.Type 上使用条件断点时出错
【发布时间】:2015-08-28 17:35:04
【问题描述】:

这是函数:

public void Init(System.Type Type) {
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

我在第一行 (this.Type = Type) 设置了一个断点,我想在 Type.FullName == "Malt.Organisation" 时中断,所以这就是我输入的条件。

但是在命中该行时会显示以下错误:

断点的条件未能执行。条件是 'Type.FullName == "Malt.Organisation"'。返回的错误是 '在 System.Type 类型的被调试对象中检查对象的状态 在这种情况下不支持。'

我做错了什么(明显的)事情?

PS。一种解决方法是将其添加到代码中:

if (Type.FullName == "Malt.Organisation") System.Diagnostics.Debugger.Break();

【问题讨论】:

  • 可能不相关,但您是否将RunTimeType or a Type 传递到您的方法中?
  • 调试器对此非常明确:“我们还不支持”。在 VS2015 中也没有,多亏了 Roslyn,它应该有更好的表现。如果它永远是您无法在此处得到回答的问题,则必须询问 Microsoft。他们不善于做出承诺。
  • 我强烈建议您不要使用 Type 作为变量名或属性名。这将不可避免地导致冲突,因为您的变量也是众所周知的类型的名称。如果将 Type 重命名为 type 和/或 theType 是否有效?
  • @HansPassant:“调试器对此非常明确” - 我不同意,因为不清楚“那个”是什么。 System.Type 作为一个有成员的班级有什么特别之处吗?是否存在由于某种原因无法检查的任意类型列表?无论如何,什么是“这个背景”?在什么情况下正在检查支持System.Type 类型的对象的状态?因此,消息只是说“出了点问题。”,但它没有暗示可能是什么什么
  • @stephen.vakil:我并不是说不存在混淆的可能性,但微软似乎并不认同你的担忧:System.Web.UI.WebControls.BaseCompareValidator.TypeSystem.Linq.Expressions.Expression.TypeSystem.Drawing.Imaging.PropertyItem.Type。跨度>

标签: c# conditional-breakpoint


【解决方案1】:

就我而言,我使用的是 Visual Studio 2013、NUnit 2.6.4,并将调试器附加到单元测试会话中,我收到了类似的消息:

断点的条件未能执行。条件是'type.Name.Contains("FooBar")'。返回的错误是“在此上下文中不支持在 System.Type 类型的调试对象中检查对象的状态。”。单击“确定”在此断点处停止。

这显然是由于微软引入的新调试引擎中缺少一个功能造成的。按照this msdn blogpost 的指示,我开始工作了。说明归结为:

  1. 从“工具”菜单打开“选项
  2. 在左侧选择“Debugging”、“General
  3. 一直向下滚动以选中“使用托管兼容模式

这应该切换到旧版调试引擎,在我的例子中,它允许在断点条件下输入表达式。请注意,您确实需要重新启动应用程序或调试会话。

免责声明:我不知道检查此选项的其他效果。就个人而言,当我完成需要它的任务时,我将其关闭了......

【讨论】:

  • 这对我也有用。我的断点肯定会对性能造成严重影响。我认为您在之后关闭设置的建议是明智的。
  • 在 VS2015 更新 2 中遇到了类似的问题:条件为 pi.Name == "whatever" 的断点(其中 pi 的类型为 System.Reflection.PropertyInfo)会弹出一个对话框 Inspecting the state of an object in the debuggee of type System.Reflection.PropertyInfo is not supported in this context. 强制调试器使用托管兼容模式现在允许按预期命中断点。 MS 需要多长时间才能让他们的“新”调试器与“旧”调试器的功能完整性?
  • 关于开启此功能的一些后果:blogs.msdn.microsoft.com/devops/2013/10/16/…(TLDR:如果您启用了“使用托管兼容性模式”,则在中断模式下您无法编辑代码)
  • 选项 使用托管兼容模式 帮助了我 (+1) 但此选项禁用了 诊断工具 窗口。这可能是调试完成后关闭模式的原因。
【解决方案2】:

你说Type.FullName == "Malt.Organisation"导致它崩溃,你试过this.Type.FullName == "Malt.Organisation"吗?

另一种可能性,调试器是否认为您正在尝试调用一个静态方法,其中变量名为 Type 就像它的类名一样?将 Type 变量重命名为其他内容可以解决问题吗?

【讨论】:

  • 有这个“解决方法”,但你是对的,它有点不受欢迎,而且会使代码混乱。
【解决方案3】:

我在 Web 应用程序中测试 IsInterface 时遇到了这个问题。我没有在调试器中启用额外功能,而是作弊。

bool blnIsInterface = tType.IsInterface;

//Insert breakpoint here...
if(blnIsInterface)
{
    ...
}

所以在你的情况下你可以做类似的事情

public void Init(System.Type Type) {
    bool blnBreak = Type.FullName == "Malt.Organisation";
    //insert breakpoint of blnBreak == true
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

这有点麻烦,但至少您不必担心性能下降,并且在 Web 应用程序中启用本机代码调试似乎不是一个选项。

【讨论】:

    【解决方案4】:

    我不确定此处描述的“使用托管兼容模式”解决方案 - 对我没有帮助,但在我自己的情况下 Project > Properties > Debug > Enable Native code debugging - 必须取消选中。

    为什么 - 目前没有任何线索。

    使用的是 .net 4.5、vs2015、控制台应用程序。

    【讨论】:

    • VS2017 左右的 netcore 大会怎么样?
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2011-11-03
    相关资源
    最近更新 更多