c# - 如何在 VS2015 的断点条件表达式中使用 Environment.StackTrace

标签 c# debugging visual-studio-2015 conditional-breakpoint

我正在尝试调试一个问题,如果我可以在属性的 getter 中设置一个断点,那将非常有帮助,但我不需要每次从 CanExecute 调用中的某个按钮调用它时都中断我的用户界面。我的想法是我可以简单地在不包含该字符串的调用堆栈上设置断点,但这似乎不起作用。我能想到的最好的解释方法是使用设置图像和命中断点的输出。

BreakpointSettings

如图所示,断点的Conditional设置在命中时直接输出,在输出中可以看到它被命中了几次.get(): true - 正确。但是,当它截取此屏幕截图时,条件为假,如输出所示。程序因断点被错误地击中而停止。

我是不是做错了什么——这有可能吗?在我看来像是 VS2015 中的一个错误,输出可以正确评估 bool,为什么断点条件不能这样做?

编辑,为图像添加注释以防它在某个时候丢失。 我在一个只返回基础字段的属性的 get 方法中有一个断点。断点设置显示断点上有一个定义它的条件,这样它应该只在表达式 !Environment.StackTrace.Contains("CanExecute") 返回 true 时命中,即只有在堆栈跟踪不包含“CanExecute”字符串。 断点设置的 Action 部分仅使用 $FUNCTION: {!Environment.StackTrace.Contains("CanExecute")} 输出函数名称和条件表达式。 Action 设置为不继续执行。

最佳答案

我不确切知道为什么堆栈跟踪信息在断点条件内不可用,但是有一个疯狂的解决方法/黑客可以作为对 another answer 中概述的技术的扩展。

如果你使用自动属性,它不会像“干净地”那样工作,因为它需要两个断点,而自动属性只有一个点可以绑定(bind)一个断点,但我想这是' 无论如何对汽车属性(property)有用。


将第一个断点放在 get 方法的左花括号上(将光标放在花括号上并按 F9)。在此断点上设置一个 Action ;将 "Log a message to Output Window:" 设置为

{System.AppDomain.CurrentDomain.SetData("break", !Environment.StackTrace.Contains("CanExecute"))}

并确保选中Continue execution

将第二个断点放在 return 语句上(将光标放在花括号上并按 F9)。在此断点上设置条件:

(bool)System.AppDomain.CurrentDomain.GetData("break")

根据您的格式,这可能需要“断点”窗口 Debug > Windows > Breakpoints (Ctrl+Alt+B) 的帮助,以防花括号和 return 语句在同一行。您可以通过右键单击“断点”窗口中的断点并选择 Settings

来编辑操作/条件

转换为 bool 是必需的,因为 GetData() 返回一个 object 并且条件断点不会为您进行转换。


它不是很漂亮,而且由于全局状态,它在多线程环境中不能很好地工作,但它在紧要关头很有用。如果您以这种方式需要多个“条件断点”,请确保在 SetData()/GetData() 中使用不同的键。

但是,如果可以的话,通常(取决于您的编译时间和对代码的访问与调试符号的访问)更快/更容易地临时编辑代码以放置您想要中断的条件。

例如

public Foo Selected
{
    get
    {
        if (!Environment.StackTrace.Contains("CanExecute"))
            System.Diagnostics.Debugger.Break();

        return _selected;
    }
}

*在自动属性的情况下,您可以在属性访问之前在 CanExecute() 方法中使用一对 Action 断点将“break”设置为 true,然后在之后设置“break"为 false,并为条件使用

(bool?)System.AppDomain.CurrentDomain.GetData("break") != false

确保它在 CanExecute() 之前和之后仍会中断,但不会在期间中断。

关于c# - 如何在 VS2015 的断点条件表达式中使用 Environment.StackTrace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38246241/

相关文章:

c# - ASP.NET MVC 找不到显示模板部分 View

c# - JContainer、JObject、JToken和Linq混淆

c# - NUMBER(2,0) 的 Oracle DB 到 EF 不能正常工作

git - 无法 pull ,因为使用 VS2015/Git 有未提交的更改

c# - 如何识别 C# 项目中未使用的类

c# - 以编程方式检查 IIS6 兼容性角色是否在 IIS7 中启用/禁用

c# - 在 Visual Studio 2015 中调试 native Android 库时断点不起作用

java - eclipse远程调试tomcat

调试和跟踪 Hotjar 数据

c++ - 无法在 visual studio 2015 中打开源文件