Visual Studio 2015中的条件断点无法正常工作

6
我在Visual Studio 2015中调试C#代码时遇到了问题。我想在断点中添加一个简单的表达式,所以我作为条件添加了“hierarchyRelation != null”。这是我正在调试的方法的本地变量,并且它确实存在。然而,在运行时,我得到了以下错误:“断点的条件执行失败。条件是“hierarchyRelation != null”。返回的错误是“断点条件必须评估为布尔操作”。单击确定在此断点处停止。”实际上,条件更加复杂,但这是重现问题的最简单情况。我尝试了各种变体,甚至比较了这个变量的属性,它总是失败。如果我尝试一个常量条件,例如“1!= 2”或“1 = 1”,它就可以正常工作。有什么问题吗?我找到了一个相关的问题this,但它是在vb代码中。其解决方案是直接在代码中添加调试方法。虽然我可以这样做,但我想知道为什么这不起作用。

方法代码

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内的第一行添加断点。

enter image description here


2
VS2015调试器确实有很多bug,但是当我尝试时它并没有出现问题。请确保已安装更新,至少更新到Update 2。可能的解决方法是通过“工具”>“选项”>“调试”>“常规”,避免使用“使用托管兼容模式”和“使用传统的C#和VB.NET表达式求值器”来避免这些bug。 - Hans Passant
我已经安装了14.0.25431.01更新3版本。将尝试检查兼容性模式。 - Gonzalo.-
2个回答

7

虽然我来晚了,但是我也遇到了相同的问题,而且是在一个动态对象中。

为了解决这个问题,我在断点条件表达式中将其转换为一个对象;所以在你的情况下,可以采取以下方法:

(object)hierarchyRelation!=null

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

谢谢!但我已经不在那家公司工作,也不再使用那种技术了。不过我还是给你点赞了。 - Gonzalo.-
1
我的情况是一个简单的整数局部变量,检查是否为 'x = 106'。必须在断点条件中显式将 x 强制转换为整数才能使其正常工作。像这样有用的东西永远不会太晚... - saminpa
对于VB.net用户,如果变量是默认的Object类型,则@saminpa的评论是相关的,您需要放置cint(x)= 106或声明变量类型。我简直不敢相信我已经知道并且可能已经有8年没有使用这个功能,因为VS抱怨x = 1没有评估为布尔值,即使它显然是这样。 - bendecko

5
问题在于hierarchyRelation是一个动态变量,虽然我不完全确定为什么。根据调试器中的表达式,它应该可以工作(我找不到任何不行的原因)。
    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的bug?将尝试移除动态内容以查看是否有效。 - Gonzalo.-
是的,这似乎是调试器的问题,尽管我无法确认。 - Jevgeni Geurtsen
我将同一份代码更新为使用静态类型的类,工作得很好。看起来这是动态类型的一个 bug。我会等待看看是否有人提出解决方案,使其与动态类型兼容,否则我会将您的答案设置为正确答案。在此期间值得点赞。 - Gonzalo.-
这绝对是一个 bug。在我看来,该变量根本不应该是动态的,因为它似乎没有任何上下文。类型 TRollup 已知,所以我会使用 var 隐式地将其类型化。虽然可能有一些技术细节需要强制它是动态的(尽管你说没有动态也可以正常工作 :P)。 - Jevgeni Geurtsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接