forked from aya/aya
Initial commit
This commit is contained in:
77
engine/network/src/CrashReporter.hpp
Normal file
77
engine/network/src/CrashReporter.hpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#ifndef __CRASH_REPORTER_H
|
||||
#define __CRASH_REPORTER_H
|
||||
|
||||
#include <assert.h>
|
||||
#include "boost/scoped_ptr.hpp"
|
||||
#include "boost/thread.hpp"
|
||||
#include "CEvent.hpp"
|
||||
|
||||
|
||||
|
||||
/// Holds all the parameters to CrashReporter::Start
|
||||
struct CrashReportControls
|
||||
{
|
||||
// Used to generate the dump filename. Required with AOC_EMAIL_WITH_ATTACHMENT or AOC_WRITE_TO_DISK
|
||||
char appName[512];
|
||||
char appVersion[512];
|
||||
|
||||
// Used with AOC_WRITE_TO_DISK . Path to write to. Not the filename, just the path. Empty string means the current directory.
|
||||
char pathToMinidump[300];
|
||||
char crashExtention[64];
|
||||
|
||||
// How much memory to write. MiniDumpNormal is the least but doesn't seem to give correct globals. MiniDumpWithDataSegs gives more.
|
||||
int minidumpType;
|
||||
};
|
||||
|
||||
/// \brief On an unhandled exception, will save a minidump and email it.
|
||||
/// A minidump can be opened in visual studio to give the callstack and local variables at the time of the crash.
|
||||
/// It has the same amount of information as if you crashed while debugging in the relevant mode. So Debug tends to give
|
||||
/// accurate stacks and info while Release does not.
|
||||
///
|
||||
/// Minidumps are only accurate for the code as it was compiled at the date of the release. So you should label releases in source control
|
||||
/// and put that label number in the 'appVersion' field.
|
||||
|
||||
void fixExceptionsThroughKernel();
|
||||
|
||||
class CrashReporter
|
||||
{
|
||||
private:
|
||||
LONG threadResult;
|
||||
struct _EXCEPTION_POINTERS* exceptionInfo;
|
||||
Aya::CEvent reportCrashEvent;
|
||||
boost::scoped_ptr<boost::thread> watcherThread;
|
||||
bool hangReportingEnabled;
|
||||
bool isAlive;
|
||||
LONG deadlockCounter;
|
||||
bool destructing;
|
||||
bool immediateUploadEnabled;
|
||||
|
||||
void LaunchUploadProcess();
|
||||
|
||||
LONG ProcessExceptionHelper(struct _EXCEPTION_POINTERS* ExceptionInfo, bool writeFullDmp, bool noMsg, char* dumpFilepath);
|
||||
|
||||
protected:
|
||||
bool silentCrashReporting;
|
||||
virtual void logEvent(const char* msg) {};
|
||||
|
||||
public:
|
||||
static CrashReporter* singleton;
|
||||
CrashReportControls controls;
|
||||
CrashReporter();
|
||||
~CrashReporter();
|
||||
void Start();
|
||||
void WatcherThreadFunc();
|
||||
virtual LONG ProcessException(struct _EXCEPTION_POINTERS* ExceptionInfo, bool noMsg);
|
||||
LONG ProcessExceptionInThead(struct _EXCEPTION_POINTERS* ExceptionInfo);
|
||||
void TheadFunc(struct _EXCEPTION_POINTERS* ExceptionInfo);
|
||||
void DisableHangReporting();
|
||||
void EnableImmediateUpload(bool enabled);
|
||||
|
||||
// call every second or so from FG thread to signal responsive app.
|
||||
// must call at least once for hang reporting to be enabled.
|
||||
void NotifyAlive();
|
||||
|
||||
HRESULT GenerateDmpFileName(__out_ecount(cchdumpFilepath) char* dumpFilepath, int cchdumpFilepath, bool fastLog = false, bool fullDmp = false);
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user