Как заставить приложение QT записывать журнал сбоев

Я работаю над проектом, разработанным в Qt, Windows, Я использую Qt Version 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".

вы видите, что здесь не так?

5
задан maxchirag 9 August 2011 в 13:32
поделиться