2016-05-16 66 views
1

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

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?

非常感谢。

+0

HTTP://source.roslyn。 IO /#Microsoft.CodeAnalysis /编译/ DataFlowAnalysis.cs – SLaks

回答

0

在Visual Studio Enterprise中有一个名为Historical Debugging的功能。通过一些limitations(仅收集AutosLocal窗口中的变量),可以查看变量历史记录,而无需重新执行代码。

0

它非常依赖于您的特定需求。

您可以检查DataFlowAnalysis作为SLaks评论,如果它符合您的需求。

或者当然你也可以使用简单朴素的选项,在每个相关操作之后使用\日志记录。

如果这两个选项是不够的,你可以尝试通过包装每一个创造与仪器做\ GET \设置等

仪器可以是静态的像StaticProxy.Fody或动态(城堡,李林甫,Sprint.Net等)。

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

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

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

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

对于创作:键= “创建”,值=列表

对于呼叫list.Add(1):=键方法调用 - 添加,值= 1