ASP.NET是如何实现的;“死亡的黄屏”;显示代码?

ASP.NET是如何实现的;“死亡的黄屏”;显示代码?,.net,asp.net,yellow-screen-of-death,.net,Asp.net,Yellow Screen Of Death,我以为.Net代码会被编译成MSIL,所以我一直想知道黄色屏幕是如何产生错误代码的。如果它正在执行编译后的代码,编译器如何从错误消息中的源文件生成代码 请随意编辑这个问题/标题,我知道这没有什么意义。我相信在进行调试生成时输出的pdb文件包含对源代码文件位置的引用。我认为这取决于可包含在已编译程序集中的调试信息。。(尽管我可能完全错了)我相信将源映射到MSIL的信息存储在PDB文件中。如果不存在此信息,则不会发生映射 正是这种查找使得异常成为如此昂贵的操作(“异常用于异常情况”).Net程序集使

我以为.Net代码会被编译成MSIL,所以我一直想知道黄色屏幕是如何产生错误代码的。如果它正在执行编译后的代码,编译器如何从错误消息中的源文件生成代码


请随意编辑这个问题/标题,我知道这没有什么意义。

我相信在进行调试生成时输出的pdb文件包含对源代码文件位置的引用。

我认为这取决于可包含在已编译程序集中的调试信息。。(尽管我可能完全错了)

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


正是这种查找使得异常成为如此昂贵的操作(“异常用于异常情况”).Net程序集使用包含的字节码元数据进行编译,该字节码允许轻松反编译代码-这就是类似工具的工作方式。PDB文件仅为调试符号-死亡黄屏中的区别在于,您将在堆栈跟踪中获得行号


换句话说,即使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>");
}
//反转堆栈
专用静态堆栈GenerateExceptionStack(异常)
{
var exceptionStack=新堆栈();
//创建异常堆栈
for(异常e=Exception;e!=null;e=e.InnerException)
{
例外情况:钉压(e);
}
返回异常标记;
}
//渲染堆栈
私有静态字符串GenerateFormattedStackTrace(堆栈异常堆栈)
{
StringBuilder跟踪=新建StringBuilder();
尝试
{
//循环遍历异常堆栈
while(exceptionStack.Count!=0)
{
trace.Append(“\r\n”);
//呈现异常类型和消息
Exception ex=exceptionStack.Pop();
trace.Append(“[”+ex.GetType().Name);
如果(!string.IsNullOrEmpty(例如Message))
{
trace.Append(“:”+ex.Message);
}
trace.Append(“]\r\n”);
//加载堆栈跟踪
StackTrace StackTrace=新的StackTrace(ex,true);
对于(int frame=0;frame”);
}

YSOD仍将显示没有PDB文件的堆栈跟踪。这是来自未处理的错误格式。get\u ColoredSquare2Content