Мое приложение Windows использует SEH и SetUnhandledExceptionFilter
создать минидамп при аварии. Я уже успешно использовал его для отладки ошибок сегментации, которые происходят на стороне клиента. И. е. Я получаю дамп, собираю ту же версию программы локально, что и ту, которая создала дамп, открываю ее и вижу некоторые записи и источники стека вызовов.
Тем не менее, теперь у меня есть дамп, который был вызван std::exception
а не сегфо В дополнение к обработчику SEH у меня также есть простой C ++ catch
блок, который выглядит так:
catch (std::exception& e)
{
Logger() << "std::exception caught:" << e.what();
throw;
}
Мини-дамп также генерируется для исключений. Когда генерируется локально, его можно открыть, и я сразу вижу, где было сгенерировано исключение — загружены PDB, доступен стек вызовов, также загружены источники. НО, когда я открываю удаленно сгенерированный дамп, я почти ничего не получаю. Единственная запись стека вызовов KERNELBASE.dll!_RaiseException@16()
источники не загружаются и т. д. И странная часть заключается в том, что пользовательский интерфейс Visual Studio отличается для дампа исключений и для дампа segfault. При загрузке дампа segfault обычно говорится, что такой-то и такой-то .pdb не может быть найден; Я могу просмотреть его и загрузить все после. За исключением дампа, буквально нет способа сделать это.
Итак, как я могу загрузить свой мини-дамп и увидеть сайт возникновения исключений?
Попробуйте перестроить свое приложение, сохраните файлы .pdb и предоставьте клиенту это приложение. Когда произойдет новый сбой, проверьте дамп-файл с сохраненными файлами .pdb.
Короче говоря, вы должны хранить все файлы .pdb для каждой версии приложения, которое вы предоставляете. Такая вещь как SymStore был изобретен для этой цели.