Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

alt text

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

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

Ответ 2

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

Ответ 3

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

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

В частности, вы должны включить следующую настройку в

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml

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

<PropertyGroup>
  <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>

Ответ 4

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

try
{
    throw new Exception();
}
catch (Exception ex)
{
    // Get line number from the stack trace top frame for the exception with source file information
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
}

Ответ 5

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

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

Ответ 6

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

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