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?

非常感谢。

4

2 回答 2

1

Visual Studio Enterprise 中有一个称为历史调试的功能。由于一些限制Autos(仅在和窗口中收集变量Local),它提供了查看变量历史记录的可能性,而无需实际重新执行代码。

于 2016-05-16T15:38:33.773 回答
0

这非常取决于您的特定需求。

如果符合您的需要,您可以检查DataFlowAnalysis作为SLaks注释。

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

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

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

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

在获得有关运行时行为的信息后,您可以随意使用它。

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

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

创建:key = "creation", value = List

对于调用 list.Add(1):key = 方法调用 - Add,value = 1

于 2016-05-17T10:44:09.613 回答