bugfixes in win64 for exception handling

This commit is contained in:
Mark Vejvoda 2013-11-04 17:42:48 +00:00
parent 1134ad399d
commit c6b42e4bf6
2 changed files with 30 additions and 2 deletions

View File

@ -394,14 +394,20 @@ void generate_stack_trace(string &out, CONTEXT ctx, int skip) {
STACKFRAME64 sf = {};
#if !defined(_WIN64)
sf.AddrPC.Offset = ctx.Eip;
#else
sf.AddrPC.Offset = ctx.Rip;
#endif
sf.AddrPC.Mode = AddrModeFlat;
#if !defined(_WIN64)
sf.AddrStack.Offset = ctx.Esp;
#else
sf.AddrStack.Offset = ctx.Rsp;
#endif
sf.AddrStack.Mode = AddrModeFlat;
#if !defined(_WIN64)
sf.AddrFrame.Offset = ctx.Ebp;
#else
sf.AddrFrame.Offset = ctx.Rbp;
#endif
sf.AddrFrame.Mode = AddrModeFlat;
@ -415,8 +421,14 @@ void generate_stack_trace(string &out, CONTEXT ctx, int skip) {
for (;;) {
SetLastError(0);
BOOL stack_walk_ok = StackWalk64(IMAGE_FILE_MACHINE_I386, process, thread, &sf,
(tryThreadContext == false ? &threadContext : &ctx), 0, &SymFunctionTableAccess64,
#if !defined(_WIN64)
BOOL stack_walk_ok = StackWalk64(IMAGE_FILE_MACHINE_I386,
#else
BOOL stack_walk_ok = StackWalk64(IMAGE_FILE_MACHINE_AMD64,
#endif
process, thread, &sf,
(tryThreadContext == false ? &threadContext : &ctx),
0, &SymFunctionTableAccess64,
&SymGetModuleBase64, 0);
if (!stack_walk_ok || !sf.AddrFrame.Offset) {
if(tryThreadContext == true) {
@ -424,14 +436,20 @@ void generate_stack_trace(string &out, CONTEXT ctx, int skip) {
if(GetThreadContext(thread, &threadContext) != 0) {
#if !defined(_WIN64)
sf.AddrPC.Offset = threadContext.Eip;
#else
sf.AddrPC.Offset = threadContext.Rip;
#endif
sf.AddrPC.Mode = AddrModeFlat;
#if !defined(_WIN64)
sf.AddrStack.Offset = threadContext.Esp;
#else
sf.AddrStack.Offset = threadContext.Rsp;
#endif
sf.AddrStack.Mode = AddrModeFlat;
#if !defined(_WIN64)
sf.AddrFrame.Offset = threadContext.Ebp;
#else
sf.AddrFrame.Offset = threadContext.Rbp;
#endif
sf.AddrFrame.Mode = AddrModeFlat;
}

View File

@ -201,10 +201,14 @@ string PlatformExceptionHandler::getStackTrace() {
STACKFRAME stackframe = { 0 };
#if !defined(_WIN64)
stackframe.AddrPC.Offset = context.Eip;
#else
stackframe.AddrPC.Offset = context.Rip;
#endif
stackframe.AddrPC.Mode = AddrModeFlat;
#if !defined(_WIN64)
stackframe.AddrFrame.Offset = context.Ebp;
#else
stackframe.AddrFrame.Offset = context.Rbp;
#endif
stackframe.AddrFrame.Mode = AddrModeFlat;
@ -213,7 +217,11 @@ string PlatformExceptionHandler::getStackTrace() {
do
{
#if !defined(_WIN64)
fSuccess = StackWalk(IMAGE_FILE_MACHINE_I386,
#else
fSuccess = StackWalk(IMAGE_FILE_MACHINE_AMD64,
#endif
GetCurrentProcess(),
GetCurrentThread(),
&stackframe,
@ -395,6 +403,8 @@ void init_win32() {
#if !defined(_WIN64)
::SetClassLong(hwnd, GCL_HICON, iconPtr);
#else
::SetClassLongPtr(hwnd, GCLP_HICON, (LONG_PTR)&iconPtr);
#endif
#endif