获取堆栈跟踪中参数的值

11

我在复现我们错误日志中看到的一些错误时遇到了麻烦。

如果我知道一个特定方法在抛出异常时使用的记录ID,那么它就可以变得更加容易。

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

有没有一种方法可以捕获抛出异常的方法的所有参数值?或者更好的是,堆栈跟踪上所有的值?


1
无法从CLR内部完成此操作,但是一些工具(如AVIcode)可以通过从外部钩入CLR来完成,基本上使用调试钩子获取信息。 - Joachim Isaksson
1
你可以尝试使用log4net http://logging.apache.org/log4net/。如果你只想查看堆栈跟踪错误,你只需要进行简单的配置即可。 - Rodrigo
1
您可以设置ProcDump(sysinternals)以在特定异常发生时捕获托管代码的完整内存转储。然后,您可以使用psscor4(用于windbg的托管代码调试扩展)查看异常发生时的进程状态 - 不过这些内容并不适合心脏脆弱的人... - Chris Moutray
1
你也可以从另一个角度来看待它:你能通过运行怀疑代码来强制引发异常吗?例如,像 Pex 这样的测试工具非常聪明,可以在代码中找到边缘情况。 - oɔɯǝɹ
3个回答

13
很遗憾,这是不可能的:当您在处理程序中捕获异常时,包含方法参数的所有堆栈帧都已消失。一旦控制权离开函数,您就无法再访问其参数值。
由于您知道崩溃发生的特定函数,因此可以在那里设置异常处理程序来收集所有感兴趣的参数,并重新抛出一个包装异常。完成诊断后,您可以将代码恢复正常:
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);
    }
}

不是我的情况,而是由第三方库抛出异常。 - alexkovelsky

3

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


-1
Environment.StackTrace的文档中,我会说这是可能的。 他们说:
每个方法调用的堆栈跟踪信息格式如下:
“在FileName :line LineNumber中的FullClassName.MethodName(MethodParams)”

7
在这个上下文中,MethodParams 是指名称和类型,而不是值。例如,at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable'1 source, Func'2 keySelector, Func'2 elementSelector, IEqualityComparer'1 comparer) - Axarydax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接