Во-первых, проблема: У меня есть несколько бесплатных проектов, и в качестве любого программного обеспечения они содержат ошибки. Некоторые пользователи, столкнувшись с ошибкой, присылают мне сообщения об ошибках со следами стека. Чтобы упростить поиск места неисправности, я хочу видеть номера строк в этих трассировках стека. Если приложение отправлено без файлов .pdb, тогда вся информация о линии теряется, поэтому в настоящее время все мои проекты, развернутые с файлами .pdb, и так созданные трассировки стека имеют эти числа. Но! Но я не хочу видеть эти файлы в дистрибутиве и хочу удалить все .pdb. Они путают пользователей, потребляют пространство в установщике и т.д.
Решение Delphi: Давным-давно, когда я был программистом delphi, я использовал следующую технику: при исключении мое приложение перемещается по стеку и собирает адреса. Затем, когда я получаю отчет об ошибке, я использовал инструмент, который восстанавливает правильную трассировку стека с именами функций и номерами строк на основе собранных адресов и соответствующих файлов символов, расположенных на моей машине.
Вопрос: Есть ли какой-либо lib, или техника или что-то подобное в .NET?
Обновление статуса: Очень интересно, что часто задавать вопрос - это лучший способ начать собственное расследование. Например, я думаю об этой проблеме в течение некоторого времени, но начинаю искать ответ только несколько дней назад.
Вариант 1: MiniDumps. После многоголоджинга я нашел способ создать мини-дамп из кода и как воссоздать стек из управляемого мини-дампа.
- Распространяемая сборка для создания кода формы мини-дампа - clrdump
- Сообщение в блоге об использовании предыдущей сборки - Создание и анализ мини-пакетов в .NET-приложениях
Это решение, однако, необходимо перераспределить две дополнительные сборки (размером ~ 1 МБ), а мини-дампы занимают некоторое пространство, и пользователю неудобно отправлять их по электронной почте. Поэтому для моих целей сейчас это неприемлемо.
Вариант 2: благодаря отличительному признаку. Можно извлечь управляемое смещение IL для каждого кадра стека. Теперь проблема в том, как получить номера строк из .pdb на основе этих смещений. И что я нашел:
- Внутренние файлы PDB, только для информации, потому что:
- ISymbolReader - управляемый интерфейс для чтения файлов программных файлов
- И, наконец, инструмент для преобразования файлов .pdb в структурированный xml для легкой обработки xpath
Используя этот инструмент, вы можете создавать файлы xml для каждой сборки релиза и помещать их в репозиторий. Когда исключение возникает на пользовательском компьютере, можно создать отформатированное сообщение об ошибке с смещениями IL. Затем пользователь отправляет это сообщение (очень маленькое) по почте. И, наконец, можно создать простой инструмент, который воссоздает полученный стек из отформатированного сообщения об ошибке.
Мне только интересно, почему никто другой не реализует такой инструмент? Я не считаю, что это интересно только мне.