я работаю над проектом, разработанным в Qt, Windows,
я использую Qt версии 4.1.4 и VC6 IDE для компиляции проекта, большая часть использования продукта на WindowsXp.
Я часто получаю отчеты о сбоях от тестировщиков и клиентов, у которых нет шаблона исправления и которые не воспроизводятся в моей среде разработки.
поэтому я прихожу к выводу, что мне нужно написать журнал сбоя из моей программы, чтобы я всегда получал стек вызовов при сбое программы.
в Linux я знаю, что это возможно сделать с некоторой обработкой сигналов ошибки сегментации. но как сделать то же самое в Windows / C ++?
Я пытался найти в Google какое-то готовое решение, но безуспешно.
Предложения, касающиеся любых сторонних инструментов / библиотек (бесплатных или лицензированных), также принимаются, но, пожалуйста, не предлагайте никаких методов, когда мне нужно изменить каждую функцию в моем модуле, чтобы получить журнал, потому что проект огромен, и я не могу позволить себе это.
заранее спасибо.
Обновления.
Я подключил StackWalker к своему коду сейчас (с небольшим количеством проблем _MBCS & UNICODE), но, по крайней мере, сумел присоединить его.
мой основной файл выглядит следующим образом,
class MyStackWalker : public StackWalker
{
FILE *sgLogFile;
public:
MyStackWalker() : StackWalker()
{
sgLogFile = fopen("ThisIsWhatIcallLog.log", "w");
}
MyStackWalker(DWORD dwProcessId, HANDLE hProcess) : StackWalker(dwProcessId, hProcess)
{
}
virtual void OnOutput(LPCSTR szText)
{
printf(szText);
fprintf(sgLogFile, "%s",szText);
fclose(sgLogFile);
StackWalker::OnOutput(szText);
}
};
LONG Win32FaultHandler(struct _EXCEPTION_POINTERS * ExInfo)
{
MyStackWalker sw;
sw.ShowCallstack();
return EXCEPTION_EXECUTE_HANDLER;
}
void InstallFaultHandler()
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER) Win32FaultHandler);
}
Но я получаю ошибку компоновщика теперь, когда символы не найдены,
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall StackWalker::ShowCallstack(void *,struct _CONTEXT const *,int (__stdcall*)(void *,unsigned __int64,void *,int,unsigned long *,void *),void *)" (?ShowCallstack@StackWalker@@QAEHPAXPBU_CONTEXT@@P6GH0_K0HPAK0@Z0@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnDbgHelpErr(char const *,int,unsigned __int64)(?OnDbgHelpErr@StackWalker@@MAEXPBDH_K@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnLoadModule(char const *,char const *,unsigned __int64,int,int,char const *,char const *,unsigned __int64)" (?OnLoadModule@StackWalker@@MAEXPBD0_KHH001@Z)
main.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall StackWalker::OnSymInit(char const *,int,char const *)" (?OnSymInit@StackWalker@@MAEXPBDH0@Z)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall StackWalker::StackWalker(int,char const *,int,void *)" (??0StackWalker@@QAE@HPBDHPAX@Z)
release/Prog.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
Я изменил файл StackWalker.cpp для адаптации к поддержке UNICODE, заменил "_tcscat_s" на "wcscat".
Вы видите, что здесь не так?