Как получить номера строк в StackTrace исключения, сгенерированного в .NET для отображения - PullRequest
30 голосов
/ 25 сентября 2010

MSDN говорит это о свойстве StackTrace класса Exception:

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

Итак, я знаю, что эта информация доступна. Как получить номера строк, которые будут отображаться в трассировке стека? Мой код генерирует исключение в очень сложном и сложном фрагменте кода, который проходит через TONS объектов, поэтому я не хочу обходить несколько миллиардов раз, чтобы увидеть, где происходит исключение. Трассировка стека исключительной ситуации показывает только сигнатуры методов, а не номера строк.

Ответы [ 6 ]

41 голосов
/ 25 сентября 2010

Чтобы получить номера строк в StackTrace, вам необходимо иметь правильную отладочную информацию (файлы PDB) вместе с вашими dll / exes.Чтобы сгенерировать отладочную информацию, установите параметр в Project Properties -> Build -> Advanced -> Debug Info:

alt text

Достаточно установить его на full (см. Документы диалогового окна «Расширенные настройки сборки» за то, что делают другие варианты).Информация об отладке (т. Е. Файлы PDB) создаются для конфигураций сборки Debug по умолчанию, но также могут создаваться для конфигураций сборки Release.

Создание PDB для сборок релизов позволяет вам отправлять код без PDB, но отбрасывать PDB рядом с dll, если вам нужны номера строк (или даже для подключения удаленного отладчика).Следует отметить, что в сборке выпуска номера строк могут быть не совсем корректными из-за оптимизаций, сделанных компилятором или JIT-компилятором (это особенно верно, если номера строк отображаются как 0).

6 голосов
/ 29 августа 2014

Если у вас есть веб-приложение или проект веб-службы, использующий VS2012 или более позднюю версию, изменение настроек сборки не будет работать.Вместо этого вы должны следовать советам, приведенным в этой статье:

Публикация на веб-сайте Visual Studio 2012, а не копирование файлов .pdb

В частности, в * необходимо включить следующую настройку1007 *

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml

файлов для вашего проекта:

<PropertyGroup>
  <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>
6 голосов
/ 25 сентября 2010

Вы должны построить проект с включенными файлами pdb и убедиться, что вы развертываете файлы pdb вместе с приложением.Вы можете проверить, действительно ли файлы pdb создаются для вашей конфигурации, щелкнув правой кнопкой мыши по сборке, для которой вам требуются файлы pdb, затем перейдите в меню «Свойства»> «Сборка»> «Дополнительно» и убедитесь, что в разделе «Выходная информация отладки» задано полное значение.

5 голосов
/ 12 ноября 2014

Вы можете попробовать следующее, если для сборки есть файл pdb:

try
{
    throw new Exception();
}
catch (Exception ex)
{
    // Get line number from the stack trace's top frame for the exception with source file information
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
}
1 голос
/ 07 августа 2014

В дополнение к другим замечательным предложениям мы развертывали IIS. У нас был промежуточный сервер и производственный сервер. Они выглядели одинаково, за исключением того, что постановка дала нам номера строк, а постановка - нет. Выяснилось, что в производственной директории bin была дополнительная DLL (это была SqlServerSpatial.dll fwiw), и как только она была перенесена в системный каталог, на производстве стали появляться номера строк.

Урок состоял в том, чтобы убедиться, что каталог bin для продукции соответствует каталогу bin для разработки во всех отношениях (кроме файлов XML).

0 голосов
/ 22 февраля 2013

Кажется, нашли решение. По крайней мере, на VS2010 с полной выходной информацией отладки я также не получил номера строк в исключениях. Фокус в том, чтобы включить номера строк в редакторе. (Инструменты -> Параметры -> Текстовый редактор -> Все языки -> Общие -> Показать -> Номера строк)

Теперь исключения отображаются с номерами строк.

...