在System.Type上使用条件断点时出错

时间:2015-08-28 17:35:04

标签: c# conditional-breakpoint

这是功能:

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();

4 个答案:

答案 0 :(得分:49)

在我的情况下,我使用Visual Studio 2013,NUnit 2.6.4,并将调试器附加到单元测试会话,我收到了类似的消息:

  

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

这显然是由微软推出的新调试引擎中缺少的功能引起的。按照this msdn blogpost的说明,我得到了一些工作。说明归结为:

  1. 从“工具”菜单中打开“选项
  2. 在左侧选择“调试”,“常规
  3. 完全滚动 以检查“使用托管兼容模式
  4. 这应该切换到遗留调试引擎,在我的情况下允许在断点条件下输入表达式。请注意,您确实需要重新启动应用程序或调试会话。

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

答案 1 :(得分:4)

你说Type.FullName == "Malt.Organisation"会导致它中断,你试过this.Type.FullName == "Malt.Organisation"吗?

另一种可能性是,调试器是否认为您正在尝试使用名为Type的变量来调用静态方法?是否将Type变量重命名为其他东西?

答案 2 :(得分: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应用程序中的一个选项。

答案 3 :(得分:1)

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

为什么 - 目前没有线索。

正在使用.net 4.5,vs2015,控制台应用程序。