DebuggerStepperBoundaryAttribute的示例用法是什么?

时间:2014-12-29 16:00:32

标签: c# visual-studio-debugging

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

  

使用DebuggerStepperBoundaryAttribute从步进中逃脱   通过代码运行代码。例如,在Visual Studio 2005中,   在单步执行时遇到DebuggerStepperBoundaryAttribute   使用F10键(或Step Over命令)的代码具有相同的效果   按F5键或使用“启动调试”命令。

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

2 个答案:

答案 0 :(得分:2)

[DebuggerStepperBoundary]字面意思是有一个调试边界。调试器通常会跳过这个(不管你喜欢StepInto多少),但是它允许你设置一个断点,在这种情况下,它会破坏。但通常的行为是跳过这个功能(运行)。

[DebuggerStepThrough]这意味着你永远不能在这里闯入。如果您尝试设置断点,只要选择“Just My Code”,它就会显示为禁用。通常用于Properties和linq等

你什么时候用这个:

我有一个使用user32.dll向某个应用发送击键的应用。我把DebuggerStepThrough放在这些函数的90%上,因为如果它们被破坏它们没有任何影响。他们需要作为一个整体运行。

希望这能回答你的问题

答案 1 :(得分:1)

这是一个简单的测试程序(启用Just My Code,并在测试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";
    }
}

reviewing the definition for DebuggerStepperBoundaryAttribute之后,我不认为定义是正确的:

  

DebuggerStepperBoundaryAttribute属性用作转义   从DebuggerNonUserCodeAttribute的影响。

您可以使用DebuggerStepperBoundaryAttribute,而不必在DebuggerNonUserCodeAttribute的上下文中。测试1上的F11立即命中测试2上的下一个断点,而不是“DebuggerNonUserCodeAttribute的效果”。我认为这应该是真正的“DebuggerStepperBoundaryAttribute属性用于在调试时逃避Step Into或Step Over的影响。”其余的定义是有道理的:

  

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

所以要回答我的问题,如果你要调用其他代码,那么你不能/不愿意将DebuggerStepThrough,DebuggerNonUserCode或DebuggerHidden添加到,但如果调试器进入该方法会比去从步骤代码到运行代码,然后使用DebuggerStepperBoundaryAttribute。 (在我的示例程序中,测试2上的F11直接将你带到SomethingHorrible,这可能比直接运行更糟(F5)。它被添加明确添加了线程的上下文切换,除此之外,我我不知道它会有用的任何情况。