C# 获取堆栈跟踪中的参数值

C# 获取堆栈跟踪中的参数值,c#,asp.net,.net,asp.net-mvc,error-handling,C#,Asp.net,.net,Asp.net Mvc,Error Handling,我很难重现我们在错误日志中看到的一些错误 如果我知道某个特定方法在抛出异常时使用的是哪个记录ID,就可以轻松得多 所有未处理的异常都由全局异常处理程序处理,它将异常的所有细节以及HTTP请求的所有细节放入日志表中 是否有方法捕获引发异常的方法的所有参数的值?或者更好的是,堆栈上的所有值都可以跟踪?我会在抛出的方法中捕获异常,收集您的参数和任何其他需要的信息,然后使用新的ApplicationException或包含其他信息的其他自定义异常重新显示错误。不幸的是,这是不可能的:在处理程序中捕获异常

我很难重现我们在错误日志中看到的一些错误

如果我知道某个特定方法在抛出异常时使用的是哪个记录ID,就可以轻松得多

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


是否有方法捕获引发异常的方法的所有参数的值?或者更好的是,堆栈上的所有值都可以跟踪?

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

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

因为您知道崩溃发生的特定函数,所以可以在那里设置异常处理程序来收集所有感兴趣的参数,然后重新抛出一个包装好的异常。诊断完成后,您可以将代码恢复到正常状态:

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);
    }
}
void可疑函数(字符串名称,长计数){
试一试{
//函数的代码在这里
}捕获(例外e){
var args=新字典{
{“name”,name}
,{“计数”,计数}
};
抛出新的MySpecialException(e,args);
}
}
从文档中我可以说这是可能的。 他们说

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

“在文件名中的FullClassName.MethodName(MethodParams)处:行号”


从CLR内部无法实现这一点,但是像AVIcode这样的一些工具可以通过从外部连接到CLR来实现,基本上是使用调试挂钩来获取信息。您可以尝试o log4net。如果要查看堆栈跟踪错误,您可以进行配置。当发生特定异常时,您可以设置ProcDump(sysinternals)以捕获托管代码的完整内存转储。然后,您可以使用psscor4(windbg托管代码调试扩展插件)查看异常发生时的进程状态——不过,这并不是为胆小的人准备的……您还可以从另一个角度来看待它:您可以通过运行可疑代码来强制执行异常吗?例如,像
Pex
这样的测试工具在查找代码中的角案例方面非常聪明。在这个上下文中,
MethodParams
是名称和类型,而不是值,例如
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1 source,Func
2 keySelector,Func
2 elementSelector,IEqualityComparer
1 comparer)
在我的情况下不是这样,异常是由第三方库引发的。