2008-08-21 67 views
13

我想.Net代码被编译到MSIL中,所以我一直想知道黄色屏幕如何产生错误的代码。如果它正在执行编译代码,编译器如何能够从错误消息中的源文件中生成代码?ASP.NET“死亡黄色屏幕”如何显示代码?

随意编辑这个问题/标题,我知道它没有任何意义。

回答

9

一个.Net程序集编译时会附带关于字节码的元数据,以便于代码的反编译 - 这就是.Net Reflector这样的工具的工作原理。 PDB文件只是调试符号 - 黄色死亡屏幕的不同之处在于您会在堆栈跟踪中获得行号。

换句话说,即使PDB文件丢失,您也会得到代码。

3

我相信当您执行调试版本时输出的pdb文件包含对源代码文件位置的引用。

+1

YSOD仍然会显示没有PDB文件的堆栈跟踪。 – 2009-07-20 19:39:51

0

我认为这是降低到可以包含在编译的程序集的调试信息。(虽然我可以肯定是错误的)

0

我相信源映射到MSIL的信息存储在PDB文件。如果这不存在,则映射不会发生。

正是这种查找使得例外这种昂贵的操作(“例外情况适用于特殊情况”)。

5

这样子。我已经做了一些改变,但它非常接近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>"); 
} 
+0

这是来自UnhandledErrorFormatter.get_ColoredSquare2Content https://referencesource.microsoft.com/#System.Web/ErrorFormatter.cs,e9e2def5e3b03f68,references – JJS 2016-11-30 22:16:01