Как заставить приложение QT писать журнал сбоев - PullRequest
5 голосов
/ 08 августа 2011

я работаю над проектом, разработанным в 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".

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

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Для кроссплатформенного приложения Breakpad, вероятно, является лучшим решением.Но простой способ для Windows - установить обработчик необработанных исключений с помощью SetUnhandledExceptionFilter и записать мини-дампы (с необходимой конфигурацией) с помощью WriteMiniDumpEx в обработчике.

пример

4 голосов
/ 08 августа 2011

Google Breakpad - это межплатформенная библиотека отчетов о сбоях, которая кажется полезной.

См. Также StackWalker , где приведен код только для Windows для получения трассировки стека.

Кроме того, хорошая установка фильтра событий путем переопределения QCoreApplication::notify и перехвата всех исключений (включая асинхронные, такие как переполнение стека и нарушение доступа в Windows) - хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...