c ++ - Sådan laver du QT-applikation, skriv en crash log

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på projekt udviklet i Qt, Windows,
jeg bruger Qt Version 4.1.4 og VC6 IDE til kompilering af projekt, det meste af brugen af ​​produktet er på WindowsXp.


Jeg modtager ofte rapporter om krasjer fra testere og kunder, som ikke har et fixmønster og ikke gengiver i mit udviklingsmiljø.


så jeg kommer til den konklusion, at jeg har brug for at skrive en crash log fra mit program, så jeg altid får opkaldsstakken når programmet krasches.


I Linux ved jeg, at det er muligt at gøre det med en vis signalhåndtering af segmenteringsfejl. men hvordan man gør det samme i Windows/C ++?


Jeg forsøgte at søge på Google for at finde nogle færdige løsninger, men uden held.


Forslag om eventuelle tredjepartsværktøjer/biblioteker (gratis eller licenseret) accepteres også, men vær venlig at foreslå nogen metode, hvor jeg skal ændre hver funktion i mit modul for at logge, fordi projektet er stort, og jeg har ikke råd til det.


tak på forhånd.


opdateringer.
Jeg har vedhæftet StackWalker til min kode nu (med lidt besvær med \_MBCS &UNICODE), men i det mindste formået at vedhæfte det.


min hovedfil ser ud nedenfor,


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);
}


Men jeg får linkerfejl nu, da symboler ikke findes,


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.


Jeg har ændret StackWalker.cpp filen for at tilpasse til UNICODE support, erstattet '\_tcscat\_s' med 'wcscat'.


kan du se, hvad går der galt her?

Bedste reference


Til platform-applikation Breakpad er sandsynligvis bedre løsning. Men let måde for Windows-at indstille uhåndteret undtagelseshåndterer via SetUnhandledExceptionFilter og skriv minidumps (med den konfiguration du har brug for) med WriteMiniDumpEx i handler.


eksempel [4]

Andre referencer 1


Google Breakpad er et krasch-rapportbibliotek på tværs af platforme, der synes nyttigt. [5]


Se også StackWalker for nogle Windows-only-kode for at få et stakspor. [6]


Det er også en god ide at installere et hændelsesfilter ved at overstyre QCoreApplication::notify og fange alle undtagelser (herunder asynkroniske dem som f.eks. Stack overløb og adgangsbrud på Windows).