page off net mvc handling funciona errors error customerrors custom asp .net asp.net yellow-screen-of-death

.net - off - customerrors mode= on



¿Cómo muestra el código de pantalla "Pantalla amarilla de la muerte" de ASP.NET? (5)

Creo que esto se debe a la información de depuración que se puede incluir con los ensamblados compilados ... (aunque definitivamente podría estar equivocado)

Pensé que el código .NET se compila en MSIL, así que siempre me pregunté cómo crearía Yellow Screens el código defectuoso. Si está ejecutando el código compilado, ¿cómo puede el compilador generar código a partir de los archivos fuente en el mensaje de error?

Siéntete libre de editar esta pregunta / título, sé que realmente no tiene sentido.


Creo que la información que mapea la fuente al MSIL se almacena en el archivo PDB. Si esto no está presente, entonces ese mapeo no ocurrirá.

Es esta búsqueda la que hace que una excepción sea una operación tan costosa ("las excepciones son para situaciones excepcionales").


Creo que los archivos pdb que salen cuando haces una compilación de depuración contienen una referencia a la ubicación de los archivos de código fuente.


Me gusta esto. He hecho algunos cambios, pero está muy cerca de lo que está haciendo exactamente.

// 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>"); }


Un ensamblado .Net se compila con metadatos sobre el bytecode incluido que permite la fácil descompilación del código, así es como funcionan herramientas como .Net Reflector . Los archivos PDB solo son símbolos de depuración: la diferencia en la pantalla amarilla de la muerte es que obtendrá números de línea en el seguimiento de la pila.

En otras palabras, obtendrá el código, incluso si faltan los archivos PDB.