在生产环境中,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上工作?
如果我在Visual Studio 2010开发环境中运行它,它会给我完整的行/列/方法名称信息,但在IIS的生产环境中,它返回所有0和方法名称为空字符串。
正确的。仔细阅读字体名称;Diagnostics
很重要。该名称空间中的类型是为诊断调试环境中的问题而设计的。
我是否需要做一些特别的事情来使它在IIS上工作?
没有;你不需要在生产中使用诊断工具。
如果出于某种原因希望在生产环境中使用诊断工具,那么至少需要将PDB文件推送到生产环境中。这可能是一件危险而愚蠢的事情,我们将在下面看到。我建议你不要这样做。
一些你没有问的问题:
在生产环境中,我应该使用什么工具来获取调用者信息?
如果你需要获取方法调用的行号等,你可能应该使用的工具是c# 5.0中新的CallerLineNumber
和相关属性。这里有一个关于他们的好博客:
如果你需要获取异常的堆栈跟踪信息,你所看到的就是你所得到的。
在调试环境中,StackTrace对象是否保证堆栈跟踪告诉我当前调用来自的位置?
。堆栈跟踪并不能告诉您程序从哪里来。堆栈跟踪告诉你下一步要去哪里。这很有用,因为你来自哪里和你下一步要去哪里之间通常有很强的相关性;通常你会回到你来的地方。
这并不总是正确的。CLR有时可以在不知道您从哪里来的情况下找出下一步要去哪里,在这种情况下,堆栈跟踪不包含您需要的信息。
例如,尾部调用优化可以从堆栈中删除帧。内联优化可以使对方法的调用看起来像是调用方法的一部分。c# 5中的异步工作流完全分离了"你从哪里来"answers"你接下来要去哪里";在await
之后恢复的异步方法的堆栈跟踪告诉您在下一个await
之后要去哪里,而不是在第一个await
之前如何进入该方法。
堆栈跟踪是不可靠的,所以不要依赖它们。仅作为诊断辅助使用。
为什么在ASP中公开诊断信息特别危险?
因为攻击者会试图通过向服务器抛出"异常"输入来导致服务器失败。如果这能让服务器宕机,那太好了,攻击者会很高兴的。如果它保持服务器正常运行,但是将源代码的信息泄露给攻击者,那就更好了。现在他们有更多的信息可以用来发动更复杂的攻击。
在生产环境中,ASP服务器应该提供尽可能少的诊断信息。在生产环境中拥有的调试信息越少,犯错误并将实现细节暴露给攻击者的可能性就越小。