DebuggerStepperBoundaryAttribute的示例用法是什么?

问题描述 投票:14回答:2

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

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

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

c# visual-studio-debugging
2个回答
2
投票

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

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

你什么时候用这个:

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

希望这能回答你的问题


1
投票

这是一个简单的测试程序(启用我的代码,并在测试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的边界内执行时,设计器提供的代码将作为步进执行,直到遇到下一个用户提供的代码。当在线程上进行上下文切换时,下一个用户提供的代码模块步入可能与正在调试的代码无关。为了避免这种调试体验,请使用DebuggerStepperBoundaryAttribute从单步调试到运行代码。例如,在Visual Studio 2005中,在使用F10键(或Step Over命令)单步执行代码时遇到DebuggerStepperBoundaryAttribute与按F5键或使用Start Debugging命令具有相同的效果。

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

© www.soinside.com 2019 - 2024. All rights reserved.