【问题标题】:Conditional breakpoint not working in Visual Studio 2015条件断点在 Visual Studio 2015 中不起作用
【发布时间】:2018-07-12 16:08:13
【问题描述】:

我在 Visual Studio 2015 中调试 C# 代码时遇到问题。

我想在断点中添加一个简单的表达式,

所以我添加了hierarchyRelation != null 作为条件。那是我正在调试的方法的局部变量,它存在。

但是,在运行时出现以下错误

"断点的条件未能执行。条件是 “层次关系!= null”。返回的错误是“断点 条件必须计算为布尔运算”。单击“确定”停止 这个断点。

实际上,情况更复杂,但这是重现问题的最简单情况。我尝试了变体,甚至比较了这个变量的属性,但它总是失败。

如果我尝试一个恒定的条件,比如1 != 21 = 1,它可以正常工作。有什么问题吗?我找到的最接近的相关问题是this,但它在vb code。它的解决方案是直接在代码中添加调试方法。虽然我可以这样做,但我想知道为什么这不起作用。

方法代码

private HierarchyNodeDto GetNodeTreeThatContainsText<TRollup, TLeaf, THierarchyRelation>(HierarchyNodeDto root, string text, PreFilter preFilter, Func<TLeaf, bool> leafContainsTextFunc, bool parentContainsText) where TRollup: HierarchyNodeDto where TLeaf: HierarchyNodeDto {
            dynamic rootNode = root as TRollup;
            if (rootNode != null) {
                if (rootNode.Nodes == null) {
                    return null;
                }
                var childNodesWithText = new List<THierarchyRelation>();
                foreach (var hierarchyRelation in rootNode.Nodes) {
                    var isLeaf = hierarchyRelation.Node.GetType() == typeof(TransactionTypeHierarchyLeafDto) || hierarchyRelation.Node.GetType() == typeof(AccountHierarchyLeafDto);
                    if (!isLeaf && hierarchyRelation.Node.Name != null && hierarchyRelation.Node.Name.ToLower().Contains(text) && preFilter != PreFilter.Leafs) {
                        childNodesWithText.Add(hierarchyRelation);
                        continue;
                    }
                    var subtreeThatContainsText = this.GetNodeTreeThatContainsText<TRollup, TLeaf, THierarchyRelation>(hierarchyRelation.Node, text, preFilter, leafContainsTextFunc, rootNode.Name.ToLower().Contains(text));
                    if (subtreeThatContainsText == null) {
                        continue;
                    }
                    hierarchyRelation.Node = subtreeThatContainsText;
                    childNodesWithText.Add(hierarchyRelation);
                }
                rootNode.Nodes = childNodesWithText;
                if (rootNode.Nodes.Count > 0 || (rootNode.Name.ToLower().Contains(text) && preFilter != PreFilter.Leafs)) {
                    return rootNode;
                }
                return null;
            }
            var rootLeaf = root as TLeaf;

            return rootLeaf != null && ((leafContainsTextFunc.Invoke(rootLeaf) && preFilter != PreFilter.Nodes) || (parentContainsText && preFilter != PreFilter.Leafs)) ? rootLeaf : null;
        }

我在foreach 内的第一行添加断点

【问题讨论】:

  • VS2015 调试器确实有很多错误,但是当我尝试它时,它看起来并没有损坏。确保安装了更新,至少安装到更新 2。可能的解决方法是避免使用工具 > 选项 > 调试 > 常规、“使用托管兼容模式”和“使用旧版 C# 和 VB.NET 表达式评估器”的错误。
  • 我已经安装了版本 14.0.25431.01 更新 3。将尝试检查兼容模式

标签: c# debugging visual-studio-2015 visual-studio-debugging


【解决方案1】:

聚会有点晚了,但无论如何,我也遇到了同样的问题,还有一个动态对象。

我为解决这个问题所做的是将其转换为断点条件表达式本身的对象;所以在你的情况下,执行以下操作会起作用:

(object)hierarchyRelation!=null

试一试,看看是否适合你。

【讨论】:

  • 谢谢!但我不再在那家公司工作,也不再使用那种技术了。不过请投上你的一票
  • 我的例子是一个简单的整数局部变量,检查'x = 106'。必须在断点条件下将 x 显式转换为整数才能使其工作。没有像这样有用的东西参加聚会为时已晚...
【解决方案2】:

问题是hierarchyRelation 是一个动态变量,尽管我不完全确定为什么。根据Expressions in the Debugger 它应该可以工作(我找不到不应该的原因)。

    static void Main(string[] args)
    {
        dynamic foo = new Foo();

        // conditional breakpoint 'foo.Nodes == null' here
    }

    internal class Foo
    {
        public IEnumerable<Foo> Nodes = null;
    }

每当调试器通过并评估条件断点时,此代码都会触发相同的异常。静态键入foo 变量将使调试器能够评估表达式并在需要时中断。

【讨论】:

  • 好的,看起来它是一个 VS 错误?将尝试删除动态以查看它是否有效
  • 是的,这似乎是调试器的问题,尽管我无法确认。
  • 我将相同的代码更新为使用静态类型的类并且工作得很好。那么它似乎是一个动态错误。将等着看是否有人想出一个解决方案来使这项工作具有动态性,否则我会将您的答案设置为正确的。在此期间值得投票
  • 这绝对是一个错误。在我看来,变量根本不应该是动态的,因为在我看来它根本不是上下文的。类型 TRollup 是已知的,因此我将使用 var 隐式键入它。我可能会遗漏一个技术细节,它迫使它是动态的(尽管你说它在没有动态的情况下工作得很好:P)
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 2017-09-26
  • 2023-03-08
  • 2023-03-12
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
相关资源
最近更新 更多