【问题标题】:How to debug particular async method, when runnig several async methods in parallel?并行运行多个异步方法时如何调试特定的异步方法?
【发布时间】:2016-08-05 07:28:02
【问题描述】:

看看这个示例代码:

class Program
{
    private static readonly Random Random = new Random();

    static async Task TaskBody()
    {
        var counter = Random.Next(100);

        while (true)
        {
            counter += Random.Next(100);
            await Task.Delay(5000);
            Console.WriteLine($"Counter = {counter}");
        }
    }

    static void Main(string[] args)
    {
        for (var i = 0; i < 10; i++)
        {
            var _ = TaskBody();
        }

        Console.ReadLine();
    }
}

假设需要调试这段代码(例如,while 正文)。
显而易见的方法是在某处打断点:

但由于有 10 个异步方法并行运行,调试器将在 每个 方法处停止。

如果只想调试特定方法怎么办?

最明显的就是设置一些断点条件。
这些东西被认为是条件:

  • ThreaId。不适合异步方法,因为可以在 await 之后更改线程。
  • TaskId。可以是(并将在此示例中)null
  • AsyncLocal&lt;T&gt; 局部变量。 AsyncLocal&lt;T&gt;.Value 不能在断点条件下使用,因为它会导致本地方法调用,这是不允许的。
  • TaskBody 签名更改。例如,在调度时传递一些“Id”(在示例中最明显的方法是从调用方法传递i)。这可行,但仅出于调试目的需要进行不必要的更改。
  • 另一个局部变量(例如Guid)作为“方法ID”。这将起作用并且看起来是最佳选择,但仍然是诀窍。

我知道ThreadsTasksParallel Stacks 调试窗口。
事实上,这个问题是在快速阅读this指南后提出的。

仅使用 VS2015 功能,无需技巧和技巧即可实现这一目标吗?

【问题讨论】:

  • 条件断点或添加变量并添加if...
  • “条件断点” - 是的,问题是写什么作为条件。
  • @x...:可以在异步方法执行期间更改线程 ID。部分异步方法可以在不同的线程上执行。

标签: c# visual-studio-2015 async-await visual-studio-debugging


【解决方案1】:

我认为最简单的方法是使用 Debug.WriteLine() 之类的东西并输出您需要的任何内容,或者更好的是,将一些值传递给线程/任务(某种 ID),然后设置一个ID==Thread#的条件断点

例如您使用 1-10 的 ID 启动线程,并且想要调试线程#5

ID == 5 的条件断点

我希望这有效:)

编辑:我认为后一个是您在问题中所说的,但我认为这是最好的解决方案,除非您有很多线程,否则 ThreadID 不应该受到伤害。

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多