Ответ 1
На самом деле проблема заключается не столько в том, чтобы отчеты о сбоях работали. Это довольно тривиально с библиотечными функциями DbgHelp и, самое главное, там MiniDumpWriteDump
. Помните, однако, чтобы перераспределить библиотеку DbgHelp на более старых системах и понаблюдать за требованиями к версии для функций, которые вы намереваетесь вызывать - более новые версии Windows поставляются с хотя бы некоторой версией этой библиотеки.
Ваша проблема с использованием компилятора, отличного от MS (проблема также существует с продуктами Embarcadero, ранее Borland, например, Watcom) заключается в том, что созданные символы отладки не имеют смысла для Библиотека DbgHelp - это стандартное средство для отладки в Windows. Формат PDB в значительной степени недокументирован (для некоторых подсказок поиск терминов: Sven Schreiber PDB), а библиотеки, используемые для их создания, не являются "общедоступными" в том же смысле, что и библиотека DbgHelp - последняя может использоваться только для чтения/разбора созданных символов отладки. Они являются частью продуктов Visual Studio и обычно называются как mspdbXY.dll(где XY - десятичные цифры).
Итак, если вы хотите создавать отчеты об ошибках, я настоятельно рекомендую вместо сосредоточиться на "проблемах компилятора", сосредоточиться на проблемах отладчика. Вот основные направления, по которым вы можете пойти:
- Используйте отладчик, который понимает ваш конкретный формат отладки (GDB для DWARF в MinGW, IIRC)
- Используйте отладчик, который понимает несколько форматов (IDA приходит на ум и имеет и другие преимущества))
- Напишите расширение на что-то вроде WinDbg, чтобы иметь смысл символов вашего дебега (DWARF) или более общих
.map
файлов (я знаю, что такие расширения были написаны несколько лет назад для файлов Borland.map
) - Изучите язык ассемблера и используйте доступные инструменты (WinDbg или, в общем, библиотеку DbgHelp) без символов (возможно, слишком крутая кривая обучения, если вы уже не знаете)
В качестве расширения до 4 вы также можете GCC создать файлы .S
(сборка) во время компиляции, чтобы перекрестно ссылаться на исходный код и аварийный дамп при работе без поддержки символов.
Учитывая, что я предпочитаю GDB на платформах unixoid, но WinDbg и другие отладчики в Windows, я не могу сказать, есть ли поддержка фактического формата дампа сбоя (созданного с помощью MiniDumpWriteDump
) в GDB в Windows, поэтому я не уверен, какой формат может ожидать от GDB в этом случае.
BTW: если вы используете Windows XP или выше и можете положиться на этот факт, используйте AddVectoredExceptionHandler
вместо SetUnhandledExceptionFilter
, чтобы подготовить запись дампа сбоя.