遇到断点时,如何防止Windows.Forms OnDeactivate中的代码运行?

时间:2018-07-30 16:42:20

标签: c# .net debugging

例如:创建一个新的Windows.Forms项目并为其指定一个按钮。添加以下代码:

protected override void OnDeactivate(EventArgs e)
{
    base.OnDeactivate(e);
    Debug.WriteLine("deactivated");
}

private void button1_Click(object sender, EventArgs e)
{
    Debug.WriteLine("hello");
}

按预期,单击该按钮时,输出窗口显示“ hello”,而激活其他窗口时,输出窗口显示“ deactivated”。

现在,在Debug.Writeline(“ hello”)上放置一个断点。单击按钮,然后恢复执行。请注意,输出窗口同时显示“ hello”和“ deactivated”。

我想找到一种防止这种情况的方法,以便调试我的应用程序不会改变其行为,而不必超出必要的范围。就像不存在断点时一样,单击处理程序应该运行,而停用处理程序应该不运行。

理想的是在Visual Studio中找到一个设置,以使达到断点不会触发应用程序中的停用事件。我没有找到这样的设置。

找到一种方法来知道代替我的被激活的应用程序是Visual Studio是可以接受的(更好:这是一些调试工具...该程序很可能使用Visual Studio Code或Mono Develop进行调试) )。然后我可以编写OnDeactivate代码,以免发生这种情况下的停用行为。

可以在断点上设置一个动作,这将在程序中设置一个阻止该动作的标志。这是一个非常不理想的解决方案,因为每个程序员都必须记住每次创建不希望停用活动的断点时都要这样做。

远程调试是另一个潜在的解决方案;但我不想使用其他系统进行所有调试。

(注意:在真实的应用程序中,停用时发生的事情是保存用户正在编辑的内容。问题是,当我正在调试其他内容时,意外的Save可能会使事情搞砸。数据可能不会处于有效状态即可保存。)

1 个答案:

答案 0 :(得分:0)

您已经说过“远程调试是另一种可能的解决方案;但是我不想使用其他系统进行所有调试。” (我猜这也排除了使用虚拟机)。

我的建议是减少编写单元测试对正在运行的应用程序进行调试的依赖。借助单元测试,您可以独立于系统的其他部分来测试系统。

有了单元测试后,您可以在“调试”下运行每个测试,从而使您可以完全像调试应用程序时一样逐步执行代码;但是由于您要定义测试的范围,因此整个应用程序都无法运行,因此可以将应用程序失去焦点之类的事情排除在范围之外。

一旦测试到位,它可以缩短代码+调试迭代周期所花费的时间,从而使您的工作效率更高。之所以能够实现这一目标,是因为该测试将您直接触发到已经设置了测试场景的相关代码中,而不是整个应用程序都必须启动,并且您每次都导航至相关部分以进入所需的场景。 / p>

这些测试的另一个好处是(如果编写方式正确)可以使它们作为自动构建的一部分运行,只要有人更改某些代码,该构建就会触发。这意味着,如果有人破坏了该代码,则测试将失败,并且构建也将失败。