这是 DebuggerNonUserCodeAttribute 的奇怪行为吗?

问题描述 投票:0回答:1

我试图让 Visual Studio 调试器在外部函数调用上按 F11(单步执行)时单步执行到特定的内部函数,

我有以下调用片段:

internal class Program
{
    static void Main()
    {
        NonUserCodeFunc();
    }

    [DebuggerNonUserCode]
    public static void NonUserCodeFunc()
    {
        LogStart();
        SomeFunc();
    }

    private static void SomeFunc()
    {
        Console.WriteLine(MethodBase.GetCurrentMethod().Name);
    }

    public static bool DoLog { get; set; } = true;

    [DebuggerNonUserCode()]
    private static void LogStart()
    {
        if (DoLog)
        {
            Console.WriteLine("Start");
        }
    }
}

我的目的是当用户在主程序中调用 'NonUserCodeFunc' 时按 F11 时,使调试器进入 'SomeFunc'

只有当'LogStart'函数中的条件行被注释掉时,我才能实现这一点。 为什么会这样?

.net visual-studio attributes visual-studio-debugging
1个回答
0
投票

只有当'LogStart'函数中的条件行被注释掉时我才能实现这一点

根据我的测试结果,这是 DebuggerNonUserCodeAttribute 的奇怪行为。看来您在 Visual Studio 中的一些调试设置错误。

当您使用

DebuggerNonUserCode
时,此属性将代码标记为
External Code
,您将不会命中断点或单步执行用此属性标记的代码。

测试结果:

您可以关闭

Just My Code” (JMC)
设置以忽略该属性。

请检查您是否启用

Just My Code
并确保禁用此功能。 在“工具”>“选项”(或“调试”>“选项”)>“调试”>“常规”下,取消选择“仅启用我的代码”。

https://learn.microsoft.com/en-us/visualstudio/debugger/just-my-code?view=vs-2022#BKMK_Enable_or_disable_Just_My_Code

此外请检查您是否已启用

Step over properties and operators (Managed only)
。 在“调试”>“常规”页面上,清除“跳过属性和运算符(仅限托管)”复选框。

总结一下,如果您想让调试器在主程序中调用“NonUserCodeFunc”时按 F11 时进入“SomeFunc”,请确保您已清除调试设置上的

Step over properties and operators
.

预期测试结果:

希望能帮到你。

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