.net - 是否可以在 .NET 的调用堆栈中获取每个帧的参数值

标签 .net clr diagnostics

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

我知道可以使用分析 API。但我想知道是否可以只使用托管代码?

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

最佳答案

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

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

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

关于.net - 是否可以在 .NET 的调用堆栈中获取每个帧的参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/819576/

相关文章:

c# - TreeView不显示对象层次结构

c# - 有没有办法在动态/扩展中执行链式空检查?

.net - 签名的程序集阻止我的服务启动

java - 当条件诊断关闭时,在 Java 中添加条件诊断是否可以实现零成本?

c# - Process.Start() : The system cannot find the file specified, 但我的文件路径似乎是合法的

C#:在 GPU 上执行操作,而不是 CPU(计算 Pi)

c# - c++ exe如何定位c# dll?

c# - 将 Enumerable.ToDictionary 与扩展方法一起使用时为 "CLR detected an Invalid Program"

c# - 如果我将对事件对象的引用复制到另一个对象并随后更改事件对象会怎样?

testing - 你如何解决一个不可重现的、随机的和变化不能立即测试的问题?