DebuggerStepperBoundaryAttribute的示例用法是什么?

Dar*_*ryl 14 c# visual-studio-debugging

我熟悉DebuggerHiddenAttributeDebuggerStepThroughAttribute.今天我注意到DebuggerStepperBoundaryAttribute,如果我理解正确的话,如果你尝试F10覆盖具有该属性的属性(或方法或其他),它将变成F5.

使用DebuggerStepperBoundaryAttribute从单步执行代码转移到运行代码.例如,在Visual Studio 2005中,使用F10键(或Step Over命令)单步调试代码时遇到DebuggerStepperBoundaryAttribute与按F5键或使用Start Debugging命令具有相同的效果.

我想不出一个有用/有用的例子.所以要么我的理解是错误的,要么我想不出一个如何有用的好例子.DebuggerStepperBoundaryAttribute的一个示例用法是什么有用/有用?

Dar*_*ryl 2

这是一个简单的测试程序(仅启用我的代码,并在测试 1、2、3 和 4 行上放置一个断点),如下所示:

class Program
{
    static void Main(string[] args)
    {
        TestDebuggerStepperBoundary();                        // Test 1
        Test();                                               // Test 2
        TestDebuggerNonUserCode(TestDebuggerStepperBoundary); // Test 3
        TestDebuggerNonUserCode(Test);                        // Test 4
    }

    [DebuggerNonUserCode]
    private static void TestDebuggerNonUserCode(Action action) { action(); }

    [DebuggerStepperBoundary]
    private static void TestDebuggerStepperBoundary() { SomethingHorrible(); }

    [DebuggerNonUserCode]
    private static void Test() { SomethingHorrible(); }

    private static void SomethingHorrible()
    {
        var foo = "bar";
    }
}
Run Code Online (Sandbox Code Playgroud)

查看 DebuggerStepperBoundaryAttribute 的定义后,我认为该定义不太正确:

DebuggerStepperBoundaryAttribute 属性用于逃避 DebuggerNonUserCodeAttribute 的影响。

DebuggerStepperBoundaryAttribute您可以在不处于 的上下文中使用DebuggerNonUserCodeAttribute。测试 1 上的 F11 立即命中测试 2 上的下一个断点,而不会处于“a 的效果DebuggerNonUserCodeAttribute”中。我认为这实际上应该读作“调试器StepperBoundaryAttribute 属性用作在调试时摆脱单步进入或单步结束的影响”。定义的其余部分是有道理的:

当在 DebuggerNonUserCodeAttribute 的边界内执行时,设计者提供的代码将作为单步执行执行,直到遇到下一个用户提供的代码。当在线程上进行上下文切换时,进入的下一个用户提供的代码模块可能与正在调试的代码无关。为了避免这种调试体验,请使用 DebuggerStepperBoundaryAttribute 来避免单步执行代码而运行代码。例如,在 Visual Studio 2005 中,使用 F10 键(或 Step Over 命令)单步执行代码时遇到 DebuggerStepperBoundaryAttribute 与按 F5 键或使用“开始调试”命令具有相同的效果。

因此,为了回答我的问题,如果您要调用其他一些代码,则您无法/不愿意添加 DebuggerStepThrough、DebuggerNonUserCode 或 DebuggerHidden,但如果调试器输入该方法会比单步执行更不和谐。 code 来运行代码,然后使用 DebuggerStepperBoundaryAttribute。(在我的示例程序中,测试 2 上的 F11 直接将您带到SomethingHorrible,这可能比直接运行(F5)更糟糕)它被添加了显式添加的线程上下文切换,除此之外,我不知道任何情况它会有用的。