Browse Source
pfCrashHandler includes a client that watches plClient for crashes. When it detects a crash, it lets the plCrashSrv (plCrashHandler.exe) know about it. We then produce a mninidump, then signal the client that it's OK to show a crash dialog. See http://www.nynaeve.net/?p=128 for a good explanation of why I split the crash logic into another process.
Adam Johnson
13 years ago
15 changed files with 765 additions and 55 deletions
@ -0,0 +1,22 @@ |
|||||||
|
include_directories("../../CoreLib") |
||||||
|
include_directories("../../NucleusLib") |
||||||
|
include_directories("../../FeatureLib") |
||||||
|
|
||||||
|
set(plCrashHandler_SOURCES |
||||||
|
main.cpp |
||||||
|
) |
||||||
|
|
||||||
|
add_executable(plCrashHandler ${plCrashHandler_SOURCES}) |
||||||
|
if(PLASMA_EXTERNAL_RELEASE) |
||||||
|
set_target_properties(plClient PROPERTIES OUTPUT_NAME "UruCrashHandler") |
||||||
|
endif(PLASMA_EXTERNAL_RELEASE) |
||||||
|
target_link_libraries(plCrashHandler CoreLib) |
||||||
|
target_link_libraries(plCrashHandler pfCrashHandler) |
||||||
|
target_link_libraries(plCrashHandler plFile) |
||||||
|
target_link_libraries(plCrashHandler pnProduct) |
||||||
|
target_link_libraries(plCrashHandler pnUtils) |
||||||
|
|
||||||
|
# Platform specific libs |
||||||
|
if(WIN32) |
||||||
|
target_link_libraries(plCrashHandler Dbghelp) |
||||||
|
endif(WIN32) |
@ -0,0 +1,72 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#include "HeadSpin.h" |
||||||
|
#include "pfCrashHandler/plCrashSrv.h" |
||||||
|
#include "pnUtils/pnUtils.h" |
||||||
|
|
||||||
|
enum
|
||||||
|
{ |
||||||
|
kArgMemFile |
||||||
|
}; |
||||||
|
|
||||||
|
static const CmdArgDef s_cmdLineArgs[] =
|
||||||
|
{ |
||||||
|
{ (kCmdArgRequired | kCmdTypeString), nil, kArgMemFile }, |
||||||
|
}; |
||||||
|
|
||||||
|
int main(int argc, char* argv[]) |
||||||
|
{ |
||||||
|
// Parse command line arguments. We MUST have the file argument
|
||||||
|
CCmdParser cmdParser(s_cmdLineArgs, arrsize(s_cmdLineArgs)); |
||||||
|
if (!cmdParser.Parse()) |
||||||
|
{ |
||||||
|
hsMessageBox("You should never run this manually.", "Error", hsMessageBoxNormal, hsMessageBoxIconExclamation); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
char* file = hsWStringToString(cmdParser.GetString(kArgMemFile)); |
||||||
|
plCrashSrv srv(file); |
||||||
|
delete[] file; |
||||||
|
srv.HandleCrash(); |
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
include_directories(../../CoreLib) |
||||||
|
include_directories(../../NucleusLib) |
||||||
|
include_directories(../../PubUtilLib) |
||||||
|
|
||||||
|
set(pfCrashHandler_HEADERS |
||||||
|
plCrashCli.h |
||||||
|
plCrashBase.h |
||||||
|
plCrash_Private.h |
||||||
|
plCrashSrv.h |
||||||
|
) |
||||||
|
|
||||||
|
set(pfCrashHandler_SOURCES |
||||||
|
plCrashCli.cpp |
||||||
|
plCrashBase.cpp |
||||||
|
plCrashSrv.cpp |
||||||
|
) |
||||||
|
|
||||||
|
add_library(pfCrashHandler STATIC ${pfCrashHandler_SOURCES} ${pfCrashHandler_HEADERS}) |
||||||
|
|
||||||
|
source_group("Source Files" FILES ${pfCrashHandler_SOURCES}) |
||||||
|
source_group("Header Files" FILES ${pfCrashHandler_HEADERS}) |
@ -0,0 +1,60 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#include "plCrashBase.h" |
||||||
|
#include "plCrash_Private.h" |
||||||
|
|
||||||
|
plCrashBase::~plCrashBase() |
||||||
|
{ |
||||||
|
delete fCrashed; |
||||||
|
delete fHandled; |
||||||
|
} |
||||||
|
|
||||||
|
void plCrashBase::IInit(const char* file) |
||||||
|
{ |
||||||
|
char sema[128]; |
||||||
|
snprintf(sema, arrsize(sema), "%s-%s", file, CRASH_NOTIFY_SUFFIX); |
||||||
|
fCrashed = new hsSemaphore(0, sema); |
||||||
|
|
||||||
|
snprintf(sema, arrsize(sema), "%s-%s", file, CRASH_HANDLE_SUFFIX); |
||||||
|
fHandled = new hsSemaphore(0, sema); |
||||||
|
} |
@ -0,0 +1,58 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#ifndef _pfCrashBase_h_ |
||||||
|
#define _pfCrashBase_h_ |
||||||
|
|
||||||
|
#include "hsThread.h" |
||||||
|
|
||||||
|
class plCrashBase |
||||||
|
{ |
||||||
|
protected: |
||||||
|
hsSemaphore* fCrashed; |
||||||
|
hsSemaphore* fHandled; |
||||||
|
|
||||||
|
~plCrashBase(); |
||||||
|
void IInit(const char* file); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // _pfCrashBase_h_
|
@ -0,0 +1,138 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#include "plCrashCli.h" |
||||||
|
#include "plCrash_Private.h" |
||||||
|
#include "plString.h" |
||||||
|
|
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
|
||||||
|
plCrashCli::plCrashCli() |
||||||
|
: fLink(nil), fLinkH(nil) |
||||||
|
{ |
||||||
|
char mapname[128]; |
||||||
|
char cmdline[128]; |
||||||
|
snprintf(mapname, arrsize(mapname), "Plasma20CrashHandler-%u", GetCurrentProcessId()); |
||||||
|
snprintf(cmdline, arrsize(cmdline), "%s %s", CRASH_HANDLER_EXE, mapname); |
||||||
|
memset(&fCrashSrv, 0, sizeof(PROCESS_INFORMATION)); |
||||||
|
|
||||||
|
// Initialize the semas
|
||||||
|
IInit(mapname); |
||||||
|
|
||||||
|
// Initialize the shared memory
|
||||||
|
fLinkH = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(plCrashMemLink), mapname); |
||||||
|
hsAssert(fLinkH, "Failed to create plCrashHandler mapping"); |
||||||
|
if (!fLinkH) |
||||||
|
return; |
||||||
|
|
||||||
|
// Map the shared memory
|
||||||
|
fLink = (plCrashMemLink*)MapViewOfFile(fLinkH, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(plCrashMemLink)); |
||||||
|
hsAssert(fLink, "Failed to map plCrashLinkedMem"); |
||||||
|
if (!fLink) |
||||||
|
return; |
||||||
|
memset(fLink, 0, sizeof(plCrashMemLink)); |
||||||
|
fLink->fClientProcessID = GetCurrentProcessId(); |
||||||
|
|
||||||
|
// Start the plCrashHandler before a crash
|
||||||
|
STARTUPINFOA info; memset(&info, 0, sizeof(info)); |
||||||
|
info.cb = sizeof(STARTUPINFOA); |
||||||
|
CreateProcessA( |
||||||
|
CRASH_HANDLER_EXE, // plCrashHandler.exe
|
||||||
|
cmdline, // plCrashHandler.exe Plasma20CrashHandler-%u
|
||||||
|
NULL, |
||||||
|
NULL, |
||||||
|
FALSE, |
||||||
|
CREATE_NO_WINDOW, // Don't create any new windows or consoles
|
||||||
|
NULL, |
||||||
|
NULL, // Use the directory of the current plClient
|
||||||
|
&info, |
||||||
|
&fCrashSrv // Save the CrashSrv handles
|
||||||
|
); |
||||||
|
|
||||||
|
HANDLE curProc = GetCurrentProcess(); |
||||||
|
DuplicateHandle(curProc, // Handle to the source process
|
||||||
|
curProc, // Handle that we want duplicated
|
||||||
|
fCrashSrv.hProcess, // Handle to target process
|
||||||
|
&fLink->fClientProcess, // Pointer to Handle to dupliicate to
|
||||||
|
0, // Ignored
|
||||||
|
FALSE, |
||||||
|
DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
plCrashCli::~plCrashCli() |
||||||
|
{ |
||||||
|
fCrashed->Signal(); // forces the CrashSrv to exit, if it's still running
|
||||||
|
if (fCrashSrv.hProcess) |
||||||
|
{ |
||||||
|
TerminateProcess(fCrashSrv.hProcess, 0); |
||||||
|
CloseHandle(fCrashSrv.hProcess); |
||||||
|
} |
||||||
|
if (fCrashSrv.hThread) |
||||||
|
CloseHandle(fCrashSrv.hThread); |
||||||
|
if (fLink) |
||||||
|
UnmapViewOfFile((LPCVOID)fLink); |
||||||
|
if (fLinkH) |
||||||
|
CloseHandle(fLinkH); |
||||||
|
} |
||||||
|
|
||||||
|
void plCrashCli::ReportCrash(PEXCEPTION_POINTERS e) |
||||||
|
{ |
||||||
|
hsAssert(fLink, "plCrashMemLink is nil"); |
||||||
|
if (fLink) |
||||||
|
{ |
||||||
|
fLink->fClientThreadID = GetCurrentThreadId(); |
||||||
|
fLink->fCrashed = true; |
||||||
|
fLink->fExceptionPtrs = e; |
||||||
|
} |
||||||
|
|
||||||
|
fCrashed->Signal(); |
||||||
|
} |
||||||
|
|
||||||
|
#else |
||||||
|
# error "Implement plCrashCli for this platform" |
||||||
|
#endif |
||||||
|
|
||||||
|
void plCrashCli::WaitForHandle() |
||||||
|
{ |
||||||
|
fHandled->Wait(); |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#ifndef _pfCrashCli_h_ |
||||||
|
#define _pfCrashCli_h_ |
||||||
|
|
||||||
|
#include "HeadSpin.h" |
||||||
|
#include "plCrashBase.h" |
||||||
|
|
||||||
|
struct plCrashMemLink; |
||||||
|
|
||||||
|
class plCrashCli : public plCrashBase |
||||||
|
{ |
||||||
|
plCrashMemLink* fLink; |
||||||
|
|
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
PROCESS_INFORMATION fCrashSrv; |
||||||
|
HANDLE fLinkH; |
||||||
|
#endif |
||||||
|
|
||||||
|
public: |
||||||
|
plCrashCli(); |
||||||
|
~plCrashCli(); |
||||||
|
|
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
void ReportCrash(PEXCEPTION_POINTERS); |
||||||
|
#endif |
||||||
|
void WaitForHandle(); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // _pfCrashCli_h_
|
@ -0,0 +1,52 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#ifndef _pnCrashCommon_h_ |
||||||
|
#define _pnCrashCommon_h_ |
||||||
|
|
||||||
|
#include "HeadSpin.h" |
||||||
|
|
||||||
|
struct plCrashLink |
||||||
|
{ |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // _pnCrashCommon_h_
|
@ -0,0 +1,117 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#include "plCrashSrv.h" |
||||||
|
#include "plCrash_Private.h" |
||||||
|
#include "plFile/plFileUtils.h" |
||||||
|
#include "pnProduct/pnProduct.h" |
||||||
|
|
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
|
||||||
|
#include <DbgHelp.h> |
||||||
|
#include <ShlObj.h> |
||||||
|
|
||||||
|
plCrashSrv::plCrashSrv(const char* file) |
||||||
|
: fLink(nil), fLinkH(nil) |
||||||
|
{ |
||||||
|
// Init semas
|
||||||
|
IInit(file); |
||||||
|
|
||||||
|
// Open the linked memory
|
||||||
|
fLinkH = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, file); |
||||||
|
hsAssert(fLinkH, "Failed to open plCrashHandler mapping"); |
||||||
|
if (!fLinkH) |
||||||
|
return; |
||||||
|
|
||||||
|
// Try to map it
|
||||||
|
fLink = (plCrashMemLink*)MapViewOfFile(fLinkH, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(plCrashMemLink)); |
||||||
|
hsAssert(fLink, "Failed to map plCrashMemLink"); |
||||||
|
} |
||||||
|
|
||||||
|
plCrashSrv::~plCrashSrv() |
||||||
|
{ |
||||||
|
if (fLink) |
||||||
|
UnmapViewOfFile((LPCVOID)fLink); |
||||||
|
if (fLinkH) |
||||||
|
CloseHandle(fLinkH); |
||||||
|
} |
||||||
|
|
||||||
|
void plCrashSrv::IHandleCrash() |
||||||
|
{ |
||||||
|
// Begin Hackiness
|
||||||
|
wchar_t dumpPath[1024]; |
||||||
|
SHGetSpecialFolderPathW(NULL, dumpPath, CSIDL_LOCAL_APPDATA, TRUE); |
||||||
|
plFileUtils::ConcatFileName(dumpPath, ProductLongName()); |
||||||
|
plFileUtils::ConcatFileName(dumpPath, L"Log"); |
||||||
|
plFileUtils::EnsureFilePathExists(dumpPath); |
||||||
|
plFileUtils::ConcatFileName(dumpPath, L"crash.dmp"); |
||||||
|
HANDLE file = CreateFileW(dumpPath, |
||||||
|
GENERIC_WRITE, |
||||||
|
0, |
||||||
|
NULL, |
||||||
|
CREATE_ALWAYS, |
||||||
|
FILE_ATTRIBUTE_NORMAL, |
||||||
|
NULL |
||||||
|
); |
||||||
|
// End Hackiness
|
||||||
|
|
||||||
|
MINIDUMP_EXCEPTION_INFORMATION e; |
||||||
|
e.ClientPointers = TRUE; |
||||||
|
e.ExceptionPointers = fLink->fExceptionPtrs; |
||||||
|
e.ThreadId = fLink->fClientThreadID; |
||||||
|
MiniDumpWriteDump(fLink->fClientProcess, fLink->fClientProcessID, file, MiniDumpNormal, &e, NULL, NULL); |
||||||
|
CloseHandle(file); |
||||||
|
} |
||||||
|
|
||||||
|
#else |
||||||
|
# error "Implement plCrashSrv for this platform" |
||||||
|
#endif |
||||||
|
|
||||||
|
void plCrashSrv::HandleCrash() |
||||||
|
{ |
||||||
|
fCrashed->Wait(); // Wait for a crash
|
||||||
|
if (!fLink) |
||||||
|
FATAL("plCrashMemLink is nil!"); |
||||||
|
else if (fLink->fCrashed) |
||||||
|
IHandleCrash(); |
||||||
|
fHandled->Signal(); // Tell CrashCli we handled it
|
||||||
|
} |
@ -0,0 +1,68 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#ifndef _pfCrashSrv_h_ |
||||||
|
#define _pfCrashSrv_h_ |
||||||
|
|
||||||
|
#include "HeadSpin.h" |
||||||
|
#include "plCrashBase.h" |
||||||
|
|
||||||
|
struct plCrashMemLink; |
||||||
|
|
||||||
|
class plCrashSrv : public plCrashBase |
||||||
|
{ |
||||||
|
plCrashMemLink* fLink; |
||||||
|
|
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
HANDLE fLinkH; |
||||||
|
#endif |
||||||
|
|
||||||
|
void IHandleCrash(); |
||||||
|
|
||||||
|
public: |
||||||
|
plCrashSrv(const char* file); |
||||||
|
~plCrashSrv(); |
||||||
|
|
||||||
|
void HandleCrash(); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // _pfCrashSrv_h_
|
@ -0,0 +1,70 @@ |
|||||||
|
/*==LICENSE==*
|
||||||
|
|
||||||
|
CyanWorlds.com Engine - MMOG client, server and tools |
||||||
|
Copyright (C) 2011 Cyan Worlds, Inc. |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Additional permissions under GNU GPL version 3 section 7 |
||||||
|
|
||||||
|
If you modify this Program, or any covered work, by linking or |
||||||
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||||
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||||
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||||
|
(or a modified version of those libraries), |
||||||
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||||
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||||
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||||
|
licensors of this Program grant you additional |
||||||
|
permission to convey the resulting work. Corresponding Source for a |
||||||
|
non-source form of such a combination shall include the source code for |
||||||
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||||
|
work. |
||||||
|
|
||||||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||||
|
or by snail mail at: |
||||||
|
Cyan Worlds, Inc. |
||||||
|
14617 N Newport Hwy |
||||||
|
Mead, WA 99021 |
||||||
|
|
||||||
|
*==LICENSE==*/ |
||||||
|
|
||||||
|
#ifndef _pfCrash_Private_h_ |
||||||
|
#define _pfCrash_Private_h_ |
||||||
|
|
||||||
|
#include "HeadSpin.h" |
||||||
|
|
||||||
|
#define CRASH_NOTIFY_SUFFIX "CrashNotify" |
||||||
|
#define CRASH_HANDLE_SUFFIX "CrashHandled" |
||||||
|
|
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
# ifdef PLASMA_EXTERNAL_RELEASE |
||||||
|
# define CRASH_HANDLER_EXE "UruCrashHandler.exe" |
||||||
|
# else |
||||||
|
# define CRASH_HANDLER_EXE "plCrashHandler.exe" |
||||||
|
# endif // PLASMA_EXTERNAL_RELEASE
|
||||||
|
#endif // HS_BUILD_FOR_WIN32
|
||||||
|
|
||||||
|
struct plCrashMemLink |
||||||
|
{ |
||||||
|
bool fCrashed; |
||||||
|
#ifdef HS_BUILD_FOR_WIN32 |
||||||
|
HANDLE fClientProcess; |
||||||
|
uint32_t fClientProcessID; |
||||||
|
uint32_t fClientThreadID; |
||||||
|
PEXCEPTION_POINTERS fExceptionPtrs; |
||||||
|
#endif |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // _pfCrash_Private_h_
|
Loading…
Reference in new issue