Сведения о вопросе

LARVION

23:06, 20th August, 2020

Теги

Как отображается код ASP.NET "Yellow Screen of Death"?

Просмотров: 415   Ответов: 5

Я думал, что код .Net компилируется в MSIL, поэтому мне всегда было интересно, как желтые экраны производят неисправный код. Если он выполняет скомпилированный код, как компилятор может создавать код из исходных файлов в сообщении об ошибке?

Не стесняйтесь редактировать это question/title, я знаю, что это действительно не имеет смысла.



  Сведения об ответе

darknet

14:59, 4th August, 2020

A .Net assembly компилируется с включенными метаданными о байт-коде, что позволяет легко декомпилировать код - именно так работают такие инструменты, как .Net Reflector . Файлы PDB являются только отладочными символами - разница в Желтом экране смерти заключается в том, что вы получите номера строк в стеке trace.

Другими словами, вы получите код, даже если файлы PDB отсутствовали.


  Сведения об ответе

padenie

09:05, 18th August, 2020

подобный этому. я внес несколько изменений, но это довольно близко к тому, что делает 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>");
}


  Сведения об ответе

padenie

21:06, 1st October, 2020

Я считаю, что pdb-файлы, которые выводятся при выполнении отладочной сборки, содержат ссылку на расположение файлов исходного кода.


  Сведения об ответе

PHPH

04:02, 14th August, 2020

Я думаю, что это сводится к отладочной информации, которая может быть включена в состав скомпилированных сборок..(хотя я определенно могу ошибаться)


  Сведения об ответе

PAGE

05:05, 13th August, 2020

Я считаю, что информация, которая сопоставляет источник с MSIL, хранится в файле PDB. Если этого нет, то такое отображение не произойдет.

Именно этот поиск делает исключение такой дорогостоящей операцией ("исключения предназначены для исключительных ситуаций").


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться