| 72 | |
| 73 | |
| 74 | void printCallstack(FILE* outputFile, PEXCEPTION_POINTERS ex) |
| 75 | { |
| 76 | if (!loadDbgHelp()) |
| 77 | return; |
| 78 | const HANDLE hProcess = GetCurrentProcess(); |
| 79 | const HANDLE hThread = GetCurrentThread(); |
| 80 | pSymInitialize( |
| 81 | hProcess, |
| 82 | nullptr, |
| 83 | TRUE |
| 84 | ); |
| 85 | CONTEXT context = *(ex->ContextRecord); |
| 86 | STACKFRAME64 stack= {0}; |
| 87 | stack.AddrPC.Mode = AddrModeFlat; |
| 88 | stack.AddrStack.Mode = AddrModeFlat; |
| 89 | stack.AddrFrame.Mode = AddrModeFlat; |
| 90 | #if defined(_M_IX86) |
| 91 | stack.AddrPC.Offset = context.Eip; |
| 92 | stack.AddrStack.Offset = context.Esp; |
| 93 | stack.AddrFrame.Offset = context.Ebp; |
| 94 | #elif defined(_M_AMD64) |
| 95 | stack.AddrPC.Offset = context.Rip; |
| 96 | stack.AddrStack.Offset = context.Rsp; |
| 97 | stack.AddrFrame.Offset = context.Rsp; |
| 98 | #elif defined(_M_ARM64) |
| 99 | stack.AddrPC.Offset = context.Pc; |
| 100 | stack.AddrStack.Offset = context.Sp; |
| 101 | stack.AddrFrame.Offset = context.Fp; |
| 102 | #else |
| 103 | #error Platform not supported! |
| 104 | #endif |
| 105 | IMAGEHLP_SYMBOL64_EXT symbol; |
| 106 | symbol.SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); |
| 107 | symbol.MaxNameLength = maxnamelength; |
| 108 | DWORD64 displacement = 0; |
| 109 | int beyond_main=-1; // emergency exit, see below |
| 110 | for (ULONG frame = 0; ; frame++) { |
| 111 | BOOL result = pStackWalk64 |
| 112 | ( |
| 113 | #if defined(_M_IX86) |
| 114 | IMAGE_FILE_MACHINE_I386, |
| 115 | #elif defined(_M_AMD64) |
| 116 | IMAGE_FILE_MACHINE_AMD64, |
| 117 | #elif defined(_M_ARM64) |
| 118 | IMAGE_FILE_MACHINE_ARM64, |
| 119 | #endif |
| 120 | hProcess, |
| 121 | hThread, |
| 122 | &stack, |
| 123 | &context, |
| 124 | nullptr, |
| 125 | pSymFunctionTableAccess64, |
| 126 | pSymGetModuleBase64, |
| 127 | nullptr |
| 128 | ); |
| 129 | if (!result) // official end... |
| 130 | break; |
| 131 | pSymGetSymFromAddr64(hProcess, (ULONG64)stack.AddrPC.Offset, &displacement, &symbol); |
no test coverage detected