【问题标题】:How to debug auto-generated code?如何调试自动生成的代码?
【发布时间】:2018-04-25 08:33:08
【问题描述】:

我正在尝试查看 IAsyncStateMachine 在运行时发生了什么,我迫切需要查看它有哪些变量以及它调用了什么。我知道您可以使用 ILSpy 查看代码……但我需要调试它。

有什么方法吗? 我需要看看 IAsyncStateMachine MoveNext 方法内部发生了什么!

public sealed partial class MethodBuilder<T> : Errand.MethodBuilder {

            public static new MethodBuilder<T> Create() => new MethodBuilder<T>();

            public new void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine {
                this.myStateMachine = stateMachine;
                this.Task = new Task<T>(this);
                stateMachine.MoveNext(); //i have to see the properties of stateMachine and inside this method !!!!!
            }

            public new void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine machine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine {



            }
            public void SetResult(T result) {
                this.Task.isCompleted = true;
                this.Task.result = result;
            }
            public new void SetStateMachine(IAsyncStateMachine stateMachine) => base.SetStateMachine(stateMachine);
            public new void SetException(Exception ex) => base.SetException(ex);
}

【问题讨论】:

  • 调试反编译代码时遇到问题的原因并不明显。除了我能想到的一个原因,使用工具 > 选项 > 调试 > 常规,取消勾选“只是我的代码”。
  • 未勾选,但我无法进入 stateMachine.MoveNext() 方法。

标签: c# async-await decompiler


【解决方案1】:

来自 MSDN How to: Debug .NET Framework Source

启用 .NET Framework 源代码调试

  1. 在“工具”菜单上,单击“选项”。

  2. 在“选项”对话框中,单击“调试”类别。

    • 在“常规”框中,设置“启用 .NET Framework 源步进”。

    • 如果您启用了“仅我的代码”,则会出现一个警告对话框告诉您 Just My Code 现在已禁用。点击确定。

  3. 如果您没有设置符号缓存位置,则会出现另一个警告 对话框告诉您默认符号缓存位置现在是 放。点击确定。

  4. 在调试类别下,单击符号。

  5. 如果要更改符号缓存位置:

    • 打开左侧框中的调试节点。

    • 在调试节点下,单击符号。

    • 将缓存符号中的位置从符号服务器编辑到此 目录或单击“浏览”选择一个位置。

  6. 如果您想立即下载符号,请单击加载符号 使用上述位置。

    此按钮在设计模式下不可用。

    如果您现在不选择下载符号,符号将 下次开始调试时自动下载 你的程序。

  7. 单击“确定”关闭“选项”对话框。

【讨论】:

  • 好的,我已经按照步骤操作了,但我仍然无法进入 IAsyncStateMachine 的 MoveNext 方法。我可以看到调用堆栈,但我希望能够跳转到该方法中。
  • @BercoviciAdrian 查看链接中的完整步骤。此外,选择您正在使用的正确的 Visual Studio 版本。每个可能有不同的说明。确保在工具 > 选项 > 调试 > 常规中取消选中 Just My Code 选项。
【解决方案2】:

也许你可以使用 debugger.launch 一旦调试器启动,Visual Studio 将提示选择 vs 版本

internal class Program
{
    public static void Main(string[] args)
    {
        System.Diagnostics.Debugger.Launch();
        Console.WriteLine("crap");
    }
}

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2015-09-06
    • 1970-01-01
    • 2010-10-04
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多