获取堆栈跟踪中的参数值

Posted

技术标签:

【中文标题】获取堆栈跟踪中的参数值【英文标题】:Get values of parameters in stack trace 【发布时间】:2013-05-20 13:07:13 【问题描述】:

我无法重现我们在错误日志中看到的一些错误。

如果我知道某个特定方法在引发异常时使用的是哪个记录 ID,这会变得容易得多。

我们所有未处理的异常都由我们的全局异常处理程序处理,它将异常的所有详细信息以及 HTTP 请求的所有详细信息放入日志表中。

有没有办法为抛出异常的方法捕获所有参数的值?或者更好的是,堆栈跟踪中的所有值?

【问题讨论】:

没有办法从 CLR 内部完成,但是像 AVIcode 这样的工具可以通过从外部连接到 CLR 来完成,基本上是使用调试挂钩来获取信息。 你可以试试 o log4net logging.apache.org/log4net 。您可以配置是否要查看堆栈跟踪错误 您可以设置 ProcDump (sysinternals) 以在发生特定异常时捕获托管代码的完整内存转储。然后,您可以使用 psscor4(windbg 的托管代码调试扩展)来查看异常发生时的进程状态 - 虽然这些东西不适合胆小的人...... 你也可以换个角度看:你可以通过执行可疑代码来强制异常吗?例如,Pex 等测试工具非常聪明地发现代码中的极端情况。 【参考方案1】:

不幸的是,这是不可能的:当您在处理程序中捕获异常时,所有带有方法参数的堆栈帧都消失了。一旦控件离开你的函数,你就不能再访问它的参数值了。

由于您知道崩溃发生的具体函数,您可以在那里设置一个异常处理程序来收集所有感兴趣的参数,并重新抛出一个包装的异常。诊断完成后,您可以将代码恢复正常:

void SuspiciousFunction(string name, long count) 
    try 
        // The code of your function goes here
     catch (Exception e) 
        var args = new Dictionary<string,object> 
             "name" , name  
        ,    "count", count 
        ;
        throw new MySpecialException(e, args);
    

【讨论】:

不是我的情况,第三方库抛出异常。【参考方案2】:

我会在它抛出的方法中捕获异常,收集您的参数和任何其他需要的信息,然后使用新的 ApplicationException 或包含您的附加信息的其他自定义异常重新抛出错误。

【讨论】:

【参考方案3】:

从文档Environment.StackTrace 我想说这是可能的。 他们说

每个方法调用的堆栈跟踪信息格式如下:

"在 FullClassName.MethodName (MethodParams) in FileName :line LineNumber"

【讨论】:

在此上下文中,MethodParams 是名称和类型,而不是值,例如 at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable1 源、Func2 keySelector, Func2 elementSelector、IEqualityComparer1 comparer)

以上是关于获取堆栈跟踪中的参数值的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 lambda 的默认参数值?

使用 DAO servlet 和 MYSQL 无法从查询中获取返回,堆栈跟踪返回 null

使用空 SQL 状态获取错误代码 4220

获取具有空SQL状态的错误代码4220

如何查看DLL中的函数信息

Azure 应用服务如何查看App Service Java堆栈JVM相关的参数默认配置值?