bugfixes in win64 for exception handling
This commit is contained in:
parent
1134ad399d
commit
c6b42e4bf6
|
@ -394,14 +394,20 @@ void generate_stack_trace(string &out, CONTEXT ctx, int skip) {
|
||||||
STACKFRAME64 sf = {};
|
STACKFRAME64 sf = {};
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
sf.AddrPC.Offset = ctx.Eip;
|
sf.AddrPC.Offset = ctx.Eip;
|
||||||
|
#else
|
||||||
|
sf.AddrPC.Offset = ctx.Rip;
|
||||||
#endif
|
#endif
|
||||||
sf.AddrPC.Mode = AddrModeFlat;
|
sf.AddrPC.Mode = AddrModeFlat;
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
sf.AddrStack.Offset = ctx.Esp;
|
sf.AddrStack.Offset = ctx.Esp;
|
||||||
|
#else
|
||||||
|
sf.AddrStack.Offset = ctx.Rsp;
|
||||||
#endif
|
#endif
|
||||||
sf.AddrStack.Mode = AddrModeFlat;
|
sf.AddrStack.Mode = AddrModeFlat;
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
sf.AddrFrame.Offset = ctx.Ebp;
|
sf.AddrFrame.Offset = ctx.Ebp;
|
||||||
|
#else
|
||||||
|
sf.AddrFrame.Offset = ctx.Rbp;
|
||||||
#endif
|
#endif
|
||||||
sf.AddrFrame.Mode = AddrModeFlat;
|
sf.AddrFrame.Mode = AddrModeFlat;
|
||||||
|
|
||||||
|
@ -415,8 +421,14 @@ void generate_stack_trace(string &out, CONTEXT ctx, int skip) {
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
SetLastError(0);
|
SetLastError(0);
|
||||||
BOOL stack_walk_ok = StackWalk64(IMAGE_FILE_MACHINE_I386, process, thread, &sf,
|
#if !defined(_WIN64)
|
||||||
(tryThreadContext == false ? &threadContext : &ctx), 0, &SymFunctionTableAccess64,
|
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);
|
&SymGetModuleBase64, 0);
|
||||||
if (!stack_walk_ok || !sf.AddrFrame.Offset) {
|
if (!stack_walk_ok || !sf.AddrFrame.Offset) {
|
||||||
if(tryThreadContext == true) {
|
if(tryThreadContext == true) {
|
||||||
|
@ -424,14 +436,20 @@ void generate_stack_trace(string &out, CONTEXT ctx, int skip) {
|
||||||
if(GetThreadContext(thread, &threadContext) != 0) {
|
if(GetThreadContext(thread, &threadContext) != 0) {
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
sf.AddrPC.Offset = threadContext.Eip;
|
sf.AddrPC.Offset = threadContext.Eip;
|
||||||
|
#else
|
||||||
|
sf.AddrPC.Offset = threadContext.Rip;
|
||||||
#endif
|
#endif
|
||||||
sf.AddrPC.Mode = AddrModeFlat;
|
sf.AddrPC.Mode = AddrModeFlat;
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
sf.AddrStack.Offset = threadContext.Esp;
|
sf.AddrStack.Offset = threadContext.Esp;
|
||||||
|
#else
|
||||||
|
sf.AddrStack.Offset = threadContext.Rsp;
|
||||||
#endif
|
#endif
|
||||||
sf.AddrStack.Mode = AddrModeFlat;
|
sf.AddrStack.Mode = AddrModeFlat;
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
sf.AddrFrame.Offset = threadContext.Ebp;
|
sf.AddrFrame.Offset = threadContext.Ebp;
|
||||||
|
#else
|
||||||
|
sf.AddrFrame.Offset = threadContext.Rbp;
|
||||||
#endif
|
#endif
|
||||||
sf.AddrFrame.Mode = AddrModeFlat;
|
sf.AddrFrame.Mode = AddrModeFlat;
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,10 +201,14 @@ string PlatformExceptionHandler::getStackTrace() {
|
||||||
STACKFRAME stackframe = { 0 };
|
STACKFRAME stackframe = { 0 };
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
stackframe.AddrPC.Offset = context.Eip;
|
stackframe.AddrPC.Offset = context.Eip;
|
||||||
|
#else
|
||||||
|
stackframe.AddrPC.Offset = context.Rip;
|
||||||
#endif
|
#endif
|
||||||
stackframe.AddrPC.Mode = AddrModeFlat;
|
stackframe.AddrPC.Mode = AddrModeFlat;
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
stackframe.AddrFrame.Offset = context.Ebp;
|
stackframe.AddrFrame.Offset = context.Ebp;
|
||||||
|
#else
|
||||||
|
stackframe.AddrFrame.Offset = context.Rbp;
|
||||||
#endif
|
#endif
|
||||||
stackframe.AddrFrame.Mode = AddrModeFlat;
|
stackframe.AddrFrame.Mode = AddrModeFlat;
|
||||||
|
|
||||||
|
@ -213,7 +217,11 @@ string PlatformExceptionHandler::getStackTrace() {
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
#if !defined(_WIN64)
|
||||||
fSuccess = StackWalk(IMAGE_FILE_MACHINE_I386,
|
fSuccess = StackWalk(IMAGE_FILE_MACHINE_I386,
|
||||||
|
#else
|
||||||
|
fSuccess = StackWalk(IMAGE_FILE_MACHINE_AMD64,
|
||||||
|
#endif
|
||||||
GetCurrentProcess(),
|
GetCurrentProcess(),
|
||||||
GetCurrentThread(),
|
GetCurrentThread(),
|
||||||
&stackframe,
|
&stackframe,
|
||||||
|
@ -395,6 +403,8 @@ void init_win32() {
|
||||||
|
|
||||||
#if !defined(_WIN64)
|
#if !defined(_WIN64)
|
||||||
::SetClassLong(hwnd, GCL_HICON, iconPtr);
|
::SetClassLong(hwnd, GCL_HICON, iconPtr);
|
||||||
|
#else
|
||||||
|
::SetClassLongPtr(hwnd, GCLP_HICON, (LONG_PTR)&iconPtr);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user