我熟悉DebuggerHiddenAttribute和DebuggerStepThroughAttribute。今天我注意到DebuggerStepperBoundaryAttribute,如果我理解正确的话,如果你尝试F10超过具有该属性的属性(或方法或其他),它将变成F5。
使用DebuggerStepperBoundaryAttribute从单步执行代码转移到运行代码。例如,在Visual Studio 2005中,在使用F10键(或Step Over命令)单步执行代码时遇到DebuggerStepperBoundaryAttribute与按F5键或使用Start Debugging命令具有相同的效果。
我想不出一个有用/有用的例子。所以要么我的理解是错误的,要么我想不出一个如何有用的好例子。 DebuggerStepperBoundaryAttribute的一个示例用法是什么有用/有用?
[DebuggerStepperBoundary]字面意思是有一个调试边界。调试器通常会跳过这个(不管你喜欢StepInto多少),但是它允许你设置一个断点,在这种情况下,它会破坏。但通常的行为是跳过这个功能(运行)。
[DebuggerStepThrough]这意味着你永远不能在这里闯入。如果您尝试设置断点,只要选择“Just My Code”,它就会显示为禁用。通常用于Properties和linq等
你什么时候用这个:
我有一个使用user32.dll将键击发送到某个应用程序的应用程序。我把DebuggerStepThrough放在这些函数的90%上,因为如果它们被破坏它们没有任何影响。他们需要作为一个整体运行。
希望这能回答你的问题
这是一个简单的测试程序(启用我的代码,并在测试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))它被明确添加了线程的上下文切换,除此之外,我不知道任何这将是有用的情况。