我想.Net代码被编译到MSIL中,所以我一直想知道黄色屏幕如何产生错误的代码。如果它正在执行编译代码,编译器如何能够从错误消息中的源文件中生成代码?ASP.NET“死亡黄色屏幕”如何显示代码?
随意编辑这个问题/标题,我知道它没有任何意义。
我想.Net代码被编译到MSIL中,所以我一直想知道黄色屏幕如何产生错误的代码。如果它正在执行编译代码,编译器如何能够从错误消息中的源文件中生成代码?ASP.NET“死亡黄色屏幕”如何显示代码?
随意编辑这个问题/标题,我知道它没有任何意义。
一个.Net程序集编译时会附带关于字节码的元数据,以便于代码的反编译 - 这就是.Net Reflector这样的工具的工作原理。 PDB文件只是调试符号 - 黄色死亡屏幕的不同之处在于您会在堆栈跟踪中获得行号。
换句话说,即使PDB文件丢失,您也会得到代码。
我相信当您执行调试版本时输出的pdb文件包含对源代码文件位置的引用。
我认为这是降低到可以包含在编译的程序集的调试信息。(虽然我可以肯定是错误的)
我相信源映射到MSIL的信息存储在PDB文件。如果这不存在,则映射不会发生。
正是这种查找使得例外这种昂贵的操作(“例外情况适用于特殊情况”)。
这样子。我已经做了一些改变,但它非常接近ms正在做的事情。
// reverse the stack
private static Stack<Exception> GenerateExceptionStack(Exception exception)
{
var exceptionStack = new Stack<Exception>();
// create exception stack
for (Exception e = exception; e != null; e = e.InnerException)
{
exceptionStack.Push(e);
}
return exceptionStack;
}
// render stack
private static string GenerateFormattedStackTrace(Stack<Exception> exceptionStack)
{
StringBuilder trace = new StringBuilder();
try
{
// loop through exception stack
while (exceptionStack.Count != 0)
{
trace.Append("\r\n");
// render exception type and message
Exception ex = exceptionStack.Pop();
trace.Append("[" + ex.GetType().Name);
if (!string.IsNullOrEmpty(ex.Message))
{
trace.Append(":" + ex.Message);
}
trace.Append("]\r\n");
// Load stack trace
StackTrace stackTrace = new StackTrace(ex, true);
for (int frame = 0; frame < stackTrace.FrameCount; frame++)
{
StackFrame stackFrame = stackTrace.GetFrame(frame);
MethodBase method = stackFrame.GetMethod();
Type declaringType = method.DeclaringType;
string declaringNamespace = "";
// get declaring type information
if (declaringType != null)
{
declaringNamespace = declaringType.Namespace ?? "";
}
// add namespace
if (!string.IsNullOrEmpty(declaringNamespace))
{
declaringNamespace += ".";
}
// add method
if (declaringType == null)
{
trace.Append(" " + method.Name + "(");
}
else
{
trace.Append(" " + declaringNamespace + declaringType.Name + "." + method.Name + "(");
}
// get parameter information
ParameterInfo[] parameters = method.GetParameters();
for (int paramIndex = 0; paramIndex < parameters.Length; paramIndex++)
{
trace.Append(((paramIndex != 0) ? "," : "") + parameters[paramIndex].ParameterType.Name + " " + parameters[paramIndex].Name);
}
trace.Append(")");
// get information
string fileName = stackFrame.GetFileName() ?? "";
if (!string.IsNullOrEmpty(fileName))
{
trace.Append(string.Concat(new object[] { " in ", fileName, ":", stackFrame.GetFileLineNumber() }));
}
else
{
trace.Append(" + " + stackFrame.GetNativeOffset());
}
trace.Append("\r\n");
}
}
}
catch
{
}
if (trace.Length == 0)
{
trace.Append("[stack trace unavailable]");
}
// return html safe stack trace
return HttpUtility.HtmlEncode(trace.ToString()).Replace(Environment.NewLine, "<br>");
}
这是来自UnhandledErrorFormatter.get_ColoredSquare2Content https://referencesource.microsoft.com/#System.Web/ErrorFormatter.cs,e9e2def5e3b03f68,references – JJS 2016-11-30 22:16:01
YSOD仍然会显示没有PDB文件的堆栈跟踪。 – 2009-07-20 19:39:51