调试IEnumerable:获取Iterator块的当前行号

时间:2018-09-04 12:42:46

标签: c# .net debugging ienumerable coroutine

我有一个Iterator块,用于模拟协程:

public class Event{}
public IEnumerable<Event> Coroutine()
{
    // ... do stuff
    yield return new Event();
    // ... do stuff
    yield return new Event();
    // ... do stuff
    yield return new Event();
    // ... do stuff
}

当我枚举时,我能以某种方式在调试器中找出最近执行的是哪一行,或者状态机将在哪一行继续执行?

foreach (var event in Coroutine())
{
    // <-- breakpoint here
    // Can I determine the 'current' line number in Coroutine() ?
    // NOTE: This foreach loop is inside a library, I can debug it but not modify it
}

我知道IEnumerable块已由.net编译器转换为状态机,并且该程序在该块外停止时没有该块的当前“ StackFrame”。但是状态机必须在某个地方存储继续执行的位置。我可以访问此信息吗?

背景:为什么我需要这个?

我正在尝试使用Dessert Framework(类似于SimPy)调试模拟。 在此框架中,无论好坏,所有模拟任务都使用yield return迭代器块作为协程实现。

调试此类模拟时,至关重要的是找出每个模拟任务的当前状态。

在上面给出的示例中,我当然可以简单地计算断点被击中的次数,并确切地知道我的迭代器块当前在哪里。 但是我要调试的情况有多个协程同时运行,生成和消耗资源,并互相等待。 IEnumerables不被我的代码占用,而是被框架本身占用。

0 个答案:

没有答案