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

140

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

ОБНОВИТЬ:

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

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

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

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

Майкл Книскерн
источник

Ответы:

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

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

  • Еще одна вещь, которую нужно проверить, - это в разделе «Пакет / Публикация в Интернете» также не отмечен флажок «Исключить сгенерированные символы отладки».
Coxy
источник
2
Обязательно ли развертывать файл pdb вместе со сборкой?
Майкл Книскерн,
7
Да. Вот где находятся символы отладки и номера строк.
Джон Сондерс,
5
Вы, вероятно, не захотите раскрывать эту информацию, если вам не нужно. Да, использовать его для отладки проблемы клиентов. Но вы не всегда хотите это делать, потому что отладочная информация может выдать конфиденциальные данные и стать вектором атаки. В зависимости от вашего приложения.
i_am_jorf
6
@Carlo: информация об отладке также работает с выпускным (оптимизированным) кодом, однако отладка несколько ограничена ( stackoverflow.com/questions/113866 ). Однако стеки вызовов достаточно надежны даже в оптимизированном коде, за исключением встроенных функций и случайных ситуаций, когда хвостовой вызов может отсутствовать, поскольку последовательность вызовов xxx / ret была заменена на jmp xxx.
Suma
12
Еще одна вещь, которую нужно проверить, - это в разделе «Пакет / Публикация в Интернете» также не отмечен флажок «Исключить сгенерированные символы отладки»
Gaz
17

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

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

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

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

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

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

Включите символы отладки в свой пакет сборки / развертывания.

Кен Браунинг
источник
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++;
}
Тим Перри
источник