在生产环境中,StackTrace/StackFrame没有返回预期的信息

本文关键字:返回 信息 StackFrame 生产环境 StackTrace | 更新日期: 2023-09-27 18:03:28

我在我的ASP中使用以下方法:. NET web应用程序接收异常的堆栈跟踪:

public static void getStackTraceInfo(System.Diagnostics.StackTrace trace)
{
    for (int i = 0; i < trace.FrameCount; i++)
    {
        int nLine = trace.GetFrame(i).GetFileLineNumber();
        int nCol = trace.GetFrame(i).GetFileColumnNumber();
        string methodName = trace.GetFrame(i).GetMethod().Name;
    }
}
try
{
}
catch(Exception ex)
{
    getStackTraceInfo(new System.Diagnostics.StackTrace(ex, true));
}

如果我在Visual Studio 2010开发环境中运行它,它会给我完整的行/列/方法名称信息,但在IIS的生产环境中,它返回所有0和方法名称为空字符串。

我是否需要做一些特别的事情来使它在IIS上工作?

在生产环境中,StackTrace/StackFrame没有返回预期的信息

如果我在Visual Studio 2010开发环境中运行它,它会给我完整的行/列/方法名称信息,但在IIS的生产环境中,它返回所有0和方法名称为空字符串。

正确的。仔细阅读字体名称;Diagnostics很重要。该名称空间中的类型是为诊断调试环境中的问题而设计的。

我是否需要做一些特别的事情来使它在IIS上工作?

没有;你不需要在生产中使用诊断工具。

如果出于某种原因希望在生产环境中使用诊断工具,那么至少需要将PDB文件推送到生产环境中。这可能是一件危险而愚蠢的事情,我们将在下面看到。我建议你不要这样做。

一些你没有问的问题:

在生产环境中,我应该使用什么工具来获取调用者信息?

如果你需要获取方法调用的行号等,你可能应该使用的工具是c# 5.0中新的CallerLineNumber和相关属性。这里有一个关于他们的好博客:

http://blog.slaks.net/2011/10/subtleties-of-c-5s-new-callerlinenumber.html

如果你需要获取异常的堆栈跟踪信息,你所看到的就是你所得到的。

在调试环境中,StackTrace对象是否保证堆栈跟踪告诉我当前调用来自的位置?

。堆栈跟踪并不能告诉您程序从哪里来。堆栈跟踪告诉你下一步要去哪里。这很有用,因为你来自哪里和你下一步要去哪里之间通常有很强的相关性;通常你会回到你来的地方。

这并不总是正确的。CLR有时可以在不知道您从哪里来的情况下找出下一步要去哪里,在这种情况下,堆栈跟踪不包含您需要的信息。

例如,尾部调用优化可以从堆栈中删除帧。内联优化可以使对方法的调用看起来像是调用方法的一部分。c# 5中的异步工作流完全分离了"你从哪里来"answers"你接下来要去哪里";在await之后恢复的异步方法的堆栈跟踪告诉您在下一个await之后要去哪里,而不是在第一个await之前如何进入该方法。

堆栈跟踪是不可靠的,所以不要依赖它们。仅作为诊断辅助使用。

为什么在ASP中公开诊断信息特别危险?

因为攻击者会试图通过向服务器抛出"异常"输入来导致服务器失败。如果这能让服务器宕机,那太好了,攻击者会很高兴的。如果它保持服务器正常运行,但是将源代码的信息泄露给攻击者,那就更好了。现在他们有更多的信息可以用来发动更复杂的攻击。

在生产环境中,ASP服务器应该提供尽可能少的诊断信息。在生产环境中拥有的调试信息越少,犯错误并将实现细节暴露给攻击者的可能性就越小。