Почему я не получаю номера строк из трассировки стека, созданной из исключений? - PullRequest
9 голосов
/ 09 февраля 2010

Хорошо; при условии, что этот код работает в режиме отладки -

static StackFrame GetTopFrameWithLineNumber(Exception e)
{
    StackTrace trace = new StackTrace(e);
    foreach (StackFrame frame in trace.GetFrames())
    {
        if (frame.GetFileLineNumber() != 0)
        {
            return frame;
        }
    }
    return null;
}

Я ВСЕГДА возвращаю ноль. Почему у стековых фреймов нет номеров строк, когда, если я проверяю строку Exception.StackTrace, она явно имеет их для любого некаркасного кода? Есть ли какая-то проблема с построением трассировки стека из исключения, о котором я не знаю?

РЕДАКТИРОВАТЬ ДЛЯ ЯРКОСТИ: В выданном исключении я вижу номера строк в свойстве StackTrace. Я предполагаю, что это означает, что у меня есть все остальное, что мне нужно.

1 Ответ

16 голосов
/ 09 февраля 2010

Согласно документации о перегрузке конструктора StackTrace, которая принимает исключение , вы не можете ожидать номеров строк при создании StackTrace таким образом.

StackTrace создается с текущий поток вызывающего, и не содержать имя файла, номер строки или информация столбца.

Чтобы получить номера строк , вам нужно использовать перегрузку, которая принимает bool, а также исключение .

Вам также нужны файлы символов (pdb) для номеров строк. Файлы символов доступны для и сборок отладки и выпуска.

...