23 switch (exceptioncode) {
24 case EXCEPTION_ACCESS_VIOLATION:
25 return "EXCEPTION_ACCESS_VIOLATION";
26 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
27 return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
28 case EXCEPTION_BREAKPOINT:
29 return "EXCEPTION_BREAKPOINT";
30 case EXCEPTION_DATATYPE_MISALIGNMENT:
31 return "EXCEPTION_DATATYPE_MISALIGNMENT";
32 case EXCEPTION_FLT_DENORMAL_OPERAND:
33 return "EXCEPTION_FLT_DENORMAL_OPERAND";
34 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
35 return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
36 case EXCEPTION_FLT_INEXACT_RESULT:
37 return "EXCEPTION_FLT_INEXACT_RESULT";
38 case EXCEPTION_FLT_INVALID_OPERATION:
39 return "EXCEPTION_FLT_INVALID_OPERATION";
40 case EXCEPTION_FLT_OVERFLOW:
41 return "EXCEPTION_FLT_OVERFLOW";
42 case EXCEPTION_FLT_STACK_CHECK:
43 return "EXCEPTION_FLT_STACK_CHECK";
44 case EXCEPTION_FLT_UNDERFLOW:
45 return "EXCEPTION_FLT_UNDERFLOW";
46 case EXCEPTION_ILLEGAL_INSTRUCTION:
47 return "EXCEPTION_ILLEGAL_INSTRUCTION";
48 case EXCEPTION_IN_PAGE_ERROR:
49 return "EXCEPTION_IN_PAGE_ERROR";
50 case EXCEPTION_INT_DIVIDE_BY_ZERO:
51 return "EXCEPTION_INT_DIVIDE_BY_ZERO";
52 case EXCEPTION_INT_OVERFLOW:
53 return "EXCEPTION_INT_OVERFLOW";
54 case EXCEPTION_INVALID_DISPOSITION:
55 return "EXCEPTION_INVALID_DISPOSITION";
56 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
57 return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
58 case EXCEPTION_PRIV_INSTRUCTION:
59 return "EXCEPTION_PRIV_INSTRUCTION";
60 case EXCEPTION_SINGLE_STEP:
61 return "EXCEPTION_SINGLE_STEP";
62 case EXCEPTION_STACK_OVERFLOW:
63 return "EXCEPTION_STACK_OVERFLOW";
65 return "UNKNOWN EXCEPTION";
85 LPBYTE lpBuffer =
NULL;
86 DWORD verSize = GetFileVersionInfoSize(file, &verHandle);
88 LPSTR verData = (LPSTR)
MEM_callocN(verSize,
"crash module version");
90 if (GetFileVersionInfo(file, verHandle, verSize, verData)) {
91 if (VerQueryValue(verData,
"\\", (VOID FAR * FAR *)&lpBuffer, &size)) {
93 VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer;
97 if (verInfo->dwSignature == 0xfeef04bd) {
101 (verInfo->dwFileVersionMS >> 16) & 0xffff,
102 (verInfo->dwFileVersionMS >> 0) & 0xffff,
103 (verInfo->dwFileVersionLS >> 16) & 0xffff,
104 (verInfo->dwFileVersionLS >> 0) & 0xffff);
116 fprintf(fp,
"Exception Record:\n\n");
118 "ExceptionCode : %s\n",
120 fprintf(fp,
"Exception Address : 0x%p\n", record->ExceptionAddress);
122 fprintf(fp,
"Exception Module : %s\n",
module);
123 fprintf(fp,
"Exception Flags : 0x%.8x\n", record->ExceptionFlags);
124 fprintf(fp,
"Exception Parameters : 0x%x\n", record->NumberParameters);
125 for (DWORD idx = 0; idx < record->NumberParameters; idx++) {
126 fprintf(fp,
"\tParameters[%d] : 0x%p\n", idx, (LPVOID *)record->ExceptionInformation[idx]);
128 if (record->ExceptionRecord) {
129 fprintf(fp,
"Nested ");
137 const int max_symbol_length = 100;
141 PSYMBOL_INFO symbolinfo =
MEM_callocN(
sizeof(SYMBOL_INFO) + max_symbol_length *
sizeof(
char),
142 "crash Symbol table");
143 symbolinfo->MaxNameLen = max_symbol_length - 1;
144 symbolinfo->SizeOfStruct =
sizeof(SYMBOL_INFO);
146 STACKFRAME frame = {0};
147 DWORD machineType = 0;
149 frame.AddrPC.Offset = context->Rip;
150 frame.AddrPC.Mode = AddrModeFlat;
151 frame.AddrFrame.Offset = context->Rsp;
152 frame.AddrFrame.Mode = AddrModeFlat;
153 frame.AddrStack.Offset = context->Rsp;
154 frame.AddrStack.Mode = AddrModeFlat;
155 machineType = IMAGE_FILE_MACHINE_AMD64;
156#elif defined(_M_ARM64)
157 frame.AddrPC.Offset = context->Pc;
158 frame.AddrPC.Mode = AddrModeFlat;
159 frame.AddrFrame.Offset = context->Fp;
160 frame.AddrFrame.Mode = AddrModeFlat;
161 frame.AddrStack.Offset = context->Sp;
162 frame.AddrStack.Mode = AddrModeFlat;
163 machineType = IMAGE_FILE_MACHINE_ARM64;
167 if (StackWalk64(machineType,
173 SymFunctionTableAccess64,
177 if (frame.AddrPC.Offset) {
182 if (SymFromAddr(GetCurrentProcess(), (DWORD64)(frame.AddrPC.Offset), 0, symbolinfo)) {
183 fprintf(fp,
"%-20s:0x%p %s",
module, (LPVOID)symbolinfo->Address, symbolinfo->Name);
184 IMAGEHLP_LINE lineinfo;
185 lineinfo.SizeOfStruct =
sizeof(lineinfo);
186 DWORD displacement = 0;
187 if (SymGetLineFromAddr(
188 GetCurrentProcess(), (DWORD64)(frame.AddrPC.Offset), &displacement, &lineinfo))
190 fprintf(fp,
" %s:%d", lineinfo.FileName, lineinfo.LineNumber);
198 (LPVOID)frame.AddrPC.Offset,
199 "Symbols not available");
219 CONTEXT context = {0};
220 context.ContextFlags = CONTEXT_ALL;
223 if (hThread != GetCurrentThread()) {
224 SuspendThread(hThread);
225 bool success = GetThreadContext(hThread, &context);
226 ResumeThread(hThread);
228 fprintf(fp,
"Cannot get thread context : 0x0%.8x\n", GetLastError());
233 RtlCaptureContext(&context);
240 fprintf(fp,
"Loaded Modules :\n");
241 HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
242 if (hModuleSnap == INVALID_HANDLE_VALUE) {
247 me32.dwSize =
sizeof(MODULEENTRY32);
249 if (!Module32First(hModuleSnap, &me32)) {
250 CloseHandle(hModuleSnap);
251 fprintf(fp,
" Error getting module list.\n");
256 if (me32.th32ProcessID == GetCurrentProcessId()) {
257 char version[MAX_PATH];
260 IMAGEHLP_MODULE64 m64;
261 m64.SizeOfStruct =
sizeof(m64);
262 if (SymGetModuleInfo64(GetCurrentProcess(), (DWORD64)me32.modBaseAddr, &m64)) {
264 "0x%p %-20s %s %s %s\n",
269 m64.PdbUnmatched ?
"[unmatched]" :
"");
272 fprintf(fp,
"0x%p %-20s %s\n", me32.modBaseAddr, version, me32.szModule);
275 }
while (Module32Next(hModuleSnap, &me32));
280 fprintf(fp,
"Threads:\n");
281 HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
284 hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
285 if (hThreadSnap == INVALID_HANDLE_VALUE) {
286 fprintf(fp,
"Unable to retrieve threads list.\n");
290 te32.dwSize =
sizeof(THREADENTRY32);
292 if (!Thread32First(hThreadSnap, &te32)) {
293 CloseHandle(hThreadSnap);
297 if (te32.th32OwnerProcessID == GetCurrentProcessId()) {
298 if (GetCurrentThreadId() != te32.th32ThreadID) {
299 fprintf(fp,
"Thread : %.8x\n", te32.th32ThreadID);
300 HANDLE ht = OpenThread(THREAD_ALL_ACCESS,
FALSE, te32.th32ThreadID);
305 }
while (Thread32Next(hThreadSnap, &te32));
306 CloseHandle(hThreadSnap);
342 char pdb_file[MAX_PATH] = {0};
345 if (GetModuleFileNameA(
NULL, pdb_file,
sizeof(pdb_file))) {
347 PathRemoveFileSpecA(pdb_file);
349 PathAppendA(pdb_file,
"blender.pdb");
350 if (PathFileExistsA(pdb_file)) {
351 HMODULE
mod = GetModuleHandle(
NULL);
353 WIN32_FILE_ATTRIBUTE_DATA file_data;
354 if (GetFileAttributesExA(pdb_file, GetFileExInfoStandard, &file_data)) {
357 SymUnloadModule64(GetCurrentProcess(), (DWORD64)
mod);
359 DWORD64 module_base = SymLoadModule(GetCurrentProcess(),
364 (DWORD)file_data.nFileSizeLow);
365 if (module_base == 0) {
367 "Error loading symbols %s\n\terror:0x%.8x\n\tsize = %d\n\tbase=0x%p\n",
370 file_data.nFileSizeLow,
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1