12

我说的是托管的.NET 代码。如果我们运行任何程序并将 VS 附加到它,我们可以在调用堆栈中看到每个方法的参数值。我想创建一个日志记录解决方案,它将记录调用堆栈中每个方法的所有参数值。实际上,如果发生异常,我需要此信息。

我知道分析 API 是可能的。但我想知道只有托管代码有可能吗?

更新:好的,可能使用纯 .NET 这是不可能的。然后可能是某种非托管代码......重点是从应用程序本身内部执行此操作。发生异常时的应用程序可以调用某个库(可能是非托管的),该库返回有关调用堆栈中方法值的信息。只是想法...

4

2 回答 2

7

参数值不存储在 StackFrame 实例中。事实上,它们根本不会被记录/记录,除非您选择明确地这样做。

记录这些值的一种明显方法是使用 AOP。这当然意味着成本,但结合日志框架和正确的日志级别,它可能是一种替代方案。您还可以选择仅检测基码中的某些类型/方法,这些类型/方法更有可能引发异常。我可能会选择 Postsharp 的静态编织功能,以发出日志调用。

无论如何,它远不是一个理想的解决方案,但是如果您被困在托管世界中,恐怕您将没有太多选择。

于 2009-05-04T10:40:52.667 回答
2

您最好的选择可能是在相关方法中插入所需的跟踪代码。这样,您可以在需要时附加跟踪侦听器并转储值。

我知道这不是您要的,但这是获取数据的一种方式。

或者,您可以使用 WinDbg 调试应用程序。!clstack/!dso 命令将让您检查参数和堆栈对象。

于 2009-05-04T10:40:21.467 回答