【问题标题】:Can I make my C# code stop at breakpoint when Visual Studio debugger is evaluating the value?当 Visual Studio 调试器评估值时,我可以让我的 C# 代码在断点处停止吗?
【发布时间】:2017-07-12 16:22:16
【问题描述】:

我不知道如何捕捉 Visual Studio 调试器在 C# 代码中评估我的属性值的时刻。断点仅在我的代码访问该属性时才有效,而不是 Visual Studio 调试器(当监视此属性时)。

我的问题是:当 Visual Studio 调试器在 Watch 窗口中显示此属性的值时,Visual Studio 是否具有更改断点行为的设置或功能,以便它们被命中(如果此类断点位于属性的 getter 中) (并为此执行这个 getter)?

我需要这个来解决我的问题(但问题不是我的问题,它只是提供一些背景,为什么我需要我要求的功能): 出于某种原因,调试器以某种方式读取我的对象的某些属性会产生不必要的副作用(导致另一个属性发生变化)。当我在代码中做同样的事情(读取对象的属性)时,不会发生这样的事情。为了找到导致这种效果的属性(因为我有很多属性),我希望在调试器评估导致我的带有这些断点的代码执行的表达式时设置断点。

我在 Visual Studio 中找不到启用此功能的任何功能。我错过了什么吗?或者,也许,它是后来添加的?我现在使用 Visual Studio 2008。

编辑:我投了反对票,所以我需要再次澄清。我不是在寻求帮助来查找我的代码中的问题(这就是为什么这里没有代码)。我要求一个非常具体的事情。由于在调试器中评估某些表达式而发生执行时,我可以让 Visual Studio 在断点处停止吗?就是这样。

public int MyProp1
{
    get
    {
      DoSomething1(); // I want VS debugger stop here on evaluating expression in Watch window
      return _value1;
    }
}
...
public int MyProp99
{
    get
    {
      DoSomething99(); // I want VS debugger stop here on evaluating expression in Watch window
      return _value99;
    }
}

【问题讨论】:

  • 您能举例说明这种变化是如何发生的吗?
  • 我猜你必须提供一个 [mvce] 来解释读取一个属性将如何修改另一个属性。
  • 是的,你可以。在您认为失败的地方立即在行/步骤上放置一个断点,以及同一行。检查之前和之后的值。没有代码(尽管有说明),但不可能为您指明正确的方向。
  • @gravity 这家伙不是来听的。他是来告诉答案是什么,而你正在耗尽他的耐心。他还不知道关于编程的一小部分信息,而你的工作就是提供它,不要废话。
  • "属性...更改值...不会发生在代码流中..." - ?!?我不确定你对不同环境下程序编译期间发生的事情有基本的了解。

标签: c# visual-studio debugging


【解决方案1】:

您不能在调试器属性评估期间启用断点。如果评估副作用导致您出现调试问题,您可以做的是关闭属性评估和其他隐式调用(例如调试器对ToString() 的调用)

在Debug->Options->General->启用属性评估和其他隐式函数调用下禁用它。

【讨论】:

    【解决方案2】:

    您可以在 VS 中设置条件断点。在您希望的行上设置断点,右键单击并点击条件。

    此链接可以帮助您解决断点条件:https://blogs.msdn.microsoft.com/zainnab/2010/05/03/set-a-simple-breakpoint-condition/

    【讨论】:

    • 我知道条件断点。但是“表达式评估命中”的条件是什么?文章没有说明..
    • 您可以在调试 -> 常规 -> 启用属性评估和其他隐式函数调用中禁用该选项。
    • 不,如果我这样做,调试器根本不会评估属性。我需要对它们进行评估,但是这些属性的 getter 中的断点被命中(就像在调试器下的正常程序流中一样)。
    • 我之所以这么说是因为您提到调试器正在读取的某些属性会导致副作用,而您不知道那是什么属性。将其关闭将消除问题,您可以手动评估需要查看的属性。根据我的理解:您启动代码,点击断点,将一个类添加到监视列表,展开它以检查属性,并且在此步骤中的某个位置,您有另一个属性意外更改,尽管您在 getter 行上有断点。您将无法通过在手表中执行函数来命中断点。
    • 您能否通过在当前断点之后立即实例化您在手表中拥有的对象,然后将其从手表中删除,然后单步执行类/属性的 init 来复制问题,同时拥有关注正在发生变化的财产?
    【解决方案3】:

    喜欢分享我们如何在 VS IDE 中使用断点的文档:

    https://msdn.microsoft.com/en-us/library/5557y8b4(v=vs.110).aspx

    我的理解是数据断点可以实现你想要的功能,但是这个功能现在确实有局限性,现在只支持VC++原生。

    所以我同意 Brian Reynolds 的观点,解决方法是您可以尝试在调试监视窗口中中断或拦截 Add and Remove。

    当然,对于数据断点问题,其他社区成员也在这里向产品团队提交了这个特性问题:

    https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/6097301-support-data-breakpoints-for-c

    如果您对 VS 产品有任何好的建议,也可以投票或提交您的功能请求。

    【讨论】:

    • 谢谢。但是,只是想仔细检查。如果数据值更改的原因是由监视窗口(评估某些属性)而不是被调试程序的代码引起的操作,数据断点是否会中断。文章从来没有提到这一点。目前,我的印象是调试窗口(无论是 Watch、Auto、Locals)引起的任何评估都不会触发任何断点..
    • @Alex,不,只是当指定的字节数从指定的地址开始修改时:stackoverflow.com/questions/4794646/…。看来它也不能真正满足您的所有要求,对吗?
    • 没有实际测试很难判断。如果这些字节由与正在调试的应用程序的线程不同的进程/线程修改但由调试器自己的线程修改,它会触发断点吗?事实证明,这需要一个全新的概念,即同时命中多个断点。我们已经停留在正在调试的应用程序的某个断点处(这是唯一存在 Watch 窗口的情况)。而现在,我们想要执行其他的东西(代码由 Watch evaluator 启动)并在应用程序自己的代码仍然停在原始 BP 处时命中另一个 BP..
    • @Alex,很抱歉我没有找到其他可能的解决方案,就像我之前的建议一样,如果可能的话,您可以直接向产品团队提交功能请求。
    • 谢谢。该功能对我来说不是必须的,因为即使没有它我也可以调试我的问题,我更想知道它是否存在,但没有它我也可以轻松生活。从讨论来看,除了我之外,没有人会需要它..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2019-03-19
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多