运行时的对象引用跟踪

时间:2016-05-16 12:14:44

标签: c# .net clr roslyn roslyn-code-analysis

我很想知道是否可以在运行时跟踪对象引用下的操作(复制,访问等)。 例如,如果我调试以下代码:

private static void Main(string[] args)
{
   // Creating new object and reference.
   var myList = new List<int>();
   // a) Copying a reference to method.
   UpdateList(myList);
}              

private static void UpdateList(IList<int> list)
{
    // b) Copying the reference.
    var localList = list;

    // c) Accessing the object through copied reference.
    localList.Add(1);
    // d) Copying a reference to method.
    int count = GetListElementsCount(localList);
}

private static int GetListElementsCount(IList<int> list)
{
     // Another reference access.
     // Breakpoint here.
     return list.Count;
}

并将断点放入GetListElementsCount,我可以查看list参数的来源以及对其所做的更改(a,b,c,d)吗? Roslyn编译器是否为此提供了一些C#API?

非常感谢。

2 个答案:

答案 0 :(得分:0)

Visual Studio Enterprise中有一个名为Historical Debugging的功能。对于一些limitations(仅在AutosLocal窗口中收集变量),它提供了查看变量历史记录而无需重新执行实际代码的可能性。

答案 1 :(得分:0)

这完全取决于您的具体需求。

如果符合您的需要,您可以将DataFlowAnalysis评为SLaks评论。

当然,您可以使用简单的天真选项,在每次相关操作之后使用日志记录。

如果这两个选项还不够,你可以通过包装每个创建\ get \ set等来尝试使用检测。

仪器可以是静态的,如StaticProxy.Fody或动态的(Castle,LinFu,Sprint.Net等)。

其他类型的工具是Instant项目。它使用NRefactory,但您可以轻松地将其转换为使用Roslyn。

获得有关运行时行为的信息后,可以根据需要使用它。

在您的示例中,在保存了某些数据结构中的所有对象更改并使用GetListElementsCount方法中断后,您可以调查数据结构并请求特定操作。

您的数据结构可以(仅用于非常简单的示例): 字典,其中键是操作名称,值是运行操作后的新值。

创作:key =“creation”,value = List

对于呼叫列表。添加(1):key =方法调用 - 添加,值= 1