Отображение количества строк в Stack Trace для сборки .NET в режиме выпуска


140

Есть ли способ отобразить строки в трассировке стека для сборки / развертывания сборки .NET в режиме выпуска?

ОБНОВИТЬ:

Мое приложение разделено на три проекта библиотеки классов и один проект «веб-сайта» ASP.NET. Ошибка, которую я пытаюсь отследить, находится в одном из трех проектов библиотеки классов. Я развернул файл pdb только для проекта библиотеки классов, который генерирует ошибку «Ссылка на объект не установлена ​​на экземпляр объекта».

Номера строк по-прежнему не отображаются в трассировке стека. Нужно ли мне развертывать файлы pdb для всех проектов, чтобы получить номера строк в трассировке стека?

Рабочий раствор

Развертывание файла pdb для каждого приложения устранило проблему с номером строки.

Ответы:


148
  • Перейдите в окно «Свойства» для проекта, где вы хотите увидеть номера строк трассировки стека.
  • Щелкните на «вертикальной вкладке» сборки.
  • Выберите конфигурацию «Release». Проверьте параметр константы DEBUG.
  • Снимите флажок с параметра «Оптимизировать код», чтобы избежать случайной проблемы с трассировкой встроенного кода (этот шаг не важен).
  • Нажмите кнопку Advanced ... и выберите Output -> Debug Info -> pdb-only.
  • Разверните сгенерированный PDB-файл со сборкой.

Реализовано с помощью комментария ниже:

  • Еще одна вещь, которую нужно проверить, - это в разделе «Пакет / Публикация в Интернете» также не отмечен флажок «Исключить сгенерированные символы отладки».

2
Обязательно ли развертывать файл pdb вместе со сборкой?
Майкл Книскерн,

7
Да. Вот где находятся символы отладки и номера строк.
Джон Сондерс,

5
Вы, вероятно, не захотите раскрывать эту информацию, если вам не нужно. Да, использовать его для отладки проблемы клиентов. Но вы не всегда хотите это делать, потому что отладочная информация может выдать конфиденциальные данные и стать вектором атаки. В зависимости от вашего приложения.
i_am_jorf

6
@Carlo: информация об отладке также работает с выпускным (оптимизированным) кодом, однако отладка несколько ограничена ( stackoverflow.com/questions/113866 ). Однако стеки вызовов достаточно надежны даже в оптимизированном коде, за исключением встроенных функций и случайных ситуаций, когда хвостовой вызов может отсутствовать, поскольку последовательность вызовов xxx / ret была заменена на jmp xxx.
Suma

12
Еще одна вещь, которую нужно проверить, - это в разделе «Пакет / Публикация в Интернете» также не отмечен флажок «Исключить сгенерированные символы отладки»
Gaz

17

В VS2012 вам также необходимо снять флажок «Исключить сгенерированные символы отладки» в разделе свойств «Пакет / Опубликовать в Интернете».


или, если это настольное приложение, убедитесь, что файл PDB развернут
парень из САПР


9

В прошлом у меня возникали проблемы, когда я чувствовал необходимость развернуть файлы PDB с выпускной сборкой, чтобы отследить ошибку. Причина, как вы сказали, в том, что исключение произошло в методе, который был очень большим, и я не мог точно определить, где это происходило.

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

Просто мысль.


Этот. И по ходу дела бросайте пробные уловы в более отрывочные места с более мелкой зернистостью. И увеличьте охрану в начале этих функций, если нужно сделать предположения.
Джерард Онилл,

Часто говорят, и это правда, однако, есть наследие, есть программисты, пишущие новые большие методы, и иногда большой метод на самом деле является лучшим решением (разделение его сбивает с толку или YAGNI). Кроме того, даже для метода из 5 строк - вы сужаете область поиска в 5 раз - поэтому PDB - необходимое зло в производстве, если вы не берете на себя
ответственность


0

В VS 2008 Express я нашел его в Project Properties -> Compile -> Advanced Compile Options.


1
Что ты нашел? Вы можете оставить комментарий, если не хотите публиковать полный ответ.
jumxozizi

-4

Это работает каждый раз. Вам просто нужно вставить строку в сообщение трассировки стека. Очень просто! Кроме того, в vb.net вам нужно сделать «Показать все файлы» и включить pdb.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

Версия C #:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.