Отобразить номер строки в Stack Trace для сборки .NET в режиме Release

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

ОБНОВЛЕНИЕ:

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

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

Рабочее решение

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

Ответ 1

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

Реализовано с комментарием ниже:

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

Ответ 2

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

Ответ 3

Мое решение

Скопируйте файл pdb в ту же папку, что и исполняемый файл.

теперь я могу просмотреть номер строки при запуске exe файла.

это причина

http://msdn.microsoft.com/en-us/library/ee416588%28v=vs.85%29.aspx

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

В VS 2008 Express я нашел его в разделе "Свойства проекта" → "Скомпилировать" → "Расширенные параметры компиляции".

Ответ 7

try { // your method } catch (Exception ex) { // log-> ex.ToString(); // it will give you whole exception including line number and
// file name }
Plus Включить файл .pdb(из папки bin) в развертывании, чтобы получить полное исключение, иначе он будет показывать только имя метода, в котором возникает исключение.

Ответ 8

Это работает каждый раз. Вам просто нужно подстроить сообщение трассировки стека. Реальный Easy! Кроме того, в 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

Версия С#:

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++;
}