我熟悉DebuggerHiddenAttribute和DebuggerStepThroughAttribute。今天我注意到DebuggerStepperBoundaryAttribute,如果我理解正确的话,如果你尝试F10覆盖具有该属性的属性(或方法或其他),它将变成F5。
使用DebuggerStepperBoundaryAttribute从步进中逃脱 通过代码运行代码。例如,在Visual Studio 2005中, 在单步执行时遇到DebuggerStepperBoundaryAttribute 使用F10键(或Step Over命令)的代码具有相同的效果 按F5键或使用“启动调试”命令。
我无法想到一个有用/有用的例子。所以要么我的理解是错误的,要么我不能想出一个如何有用的好例子。什么是DebuggerStepperBoundaryAttribute的示例用法,这将是有用/有用的?
答案 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)。它被添加明确添加了线程的上下文切换,除此之外,我我不知道它会有用的任何情况。