35 switch (exceptioncode) {
36 case EXCEPTION_ACCESS_VIOLATION:
37 return "EXCEPTION_ACCESS_VIOLATION";
38 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
39 return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
40 case EXCEPTION_BREAKPOINT:
41 return "EXCEPTION_BREAKPOINT";
42 case EXCEPTION_DATATYPE_MISALIGNMENT:
43 return "EXCEPTION_DATATYPE_MISALIGNMENT";
44 case EXCEPTION_FLT_DENORMAL_OPERAND:
45 return "EXCEPTION_FLT_DENORMAL_OPERAND";
46 case EXCEPTION_FLT_DIVIDE_BY_ZERO:
47 return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
48 case EXCEPTION_FLT_INEXACT_RESULT:
49 return "EXCEPTION_FLT_INEXACT_RESULT";
50 case EXCEPTION_FLT_INVALID_OPERATION:
51 return "EXCEPTION_FLT_INVALID_OPERATION";
52 case EXCEPTION_FLT_OVERFLOW:
53 return "EXCEPTION_FLT_OVERFLOW";
54 case EXCEPTION_FLT_STACK_CHECK:
55 return "EXCEPTION_FLT_STACK_CHECK";
56 case EXCEPTION_FLT_UNDERFLOW:
57 return "EXCEPTION_FLT_UNDERFLOW";
58 case EXCEPTION_ILLEGAL_INSTRUCTION:
59 return "EXCEPTION_ILLEGAL_INSTRUCTION";
60 case EXCEPTION_IN_PAGE_ERROR:
61 return "EXCEPTION_IN_PAGE_ERROR";
62 case EXCEPTION_INT_DIVIDE_BY_ZERO:
63 return "EXCEPTION_INT_DIVIDE_BY_ZERO";
64 case EXCEPTION_INT_OVERFLOW:
65 return "EXCEPTION_INT_OVERFLOW";
66 case EXCEPTION_INVALID_DISPOSITION:
67 return "EXCEPTION_INVALID_DISPOSITION";
68 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
69 return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
70 case EXCEPTION_PRIV_INSTRUCTION:
71 return "EXCEPTION_PRIV_INSTRUCTION";
72 case EXCEPTION_SINGLE_STEP:
73 return "EXCEPTION_SINGLE_STEP";
74 case EXCEPTION_STACK_OVERFLOW:
75 return "EXCEPTION_STACK_OVERFLOW";
77 return "UNKNOWN EXCEPTION";
85 if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, address, &
mod)) {
97 LPBYTE lpBuffer =
NULL;
98 DWORD verSize = GetFileVersionInfoSize(
file, &verHandle);
100 LPSTR verData = (LPSTR)
MEM_callocN(verSize,
"crash module version");
102 if (GetFileVersionInfo(
file, verHandle, verSize, verData)) {
103 if (VerQueryValue(verData,
"\\", (VOID FAR * FAR *)&lpBuffer, &
size)) {
105 VS_FIXEDFILEINFO *verInfo = (VS_FIXEDFILEINFO *)lpBuffer;
109 if (verInfo->dwSignature == 0xfeef04bd) {
113 (verInfo->dwFileVersionMS >> 16) & 0xffff,
114 (verInfo->dwFileVersionMS >> 0) & 0xffff,
115 (verInfo->dwFileVersionLS >> 16) & 0xffff,
116 (verInfo->dwFileVersionLS >> 0) & 0xffff);
128 fprintf(fp,
"Exception Record:\n\n");
130 "ExceptionCode : %s\n",
132 fprintf(fp,
"Exception Address : 0x%p\n", record->ExceptionAddress);
134 fprintf(fp,
"Exception Module : %s\n",
module);
135 fprintf(fp,
"Exception Flags : 0x%.8x\n", record->ExceptionFlags);
136 fprintf(fp,
"Exception Parameters : 0x%x\n", record->NumberParameters);
137 for (DWORD idx = 0; idx < record->NumberParameters; idx++) {
138 fprintf(fp,
"\tParameters[%d] : 0x%p\n", idx, (
LPVOID *)record->ExceptionInformation[idx]);
140 if (record->ExceptionRecord) {
141 fprintf(fp,
"Nested ");
149 const int max_symbol_length = 100;
153 PSYMBOL_INFO symbolinfo =
MEM_callocN(
sizeof(SYMBOL_INFO) + max_symbol_length *
sizeof(
char),
154 "crash Symbol table");
155 symbolinfo->MaxNameLen = max_symbol_length - 1;
156 symbolinfo->SizeOfStruct =
sizeof(SYMBOL_INFO);
158 STACKFRAME frame = {0};
159 frame.AddrPC.Offset =
context->Rip;
160 frame.AddrPC.Mode = AddrModeFlat;
161 frame.AddrFrame.Offset =
context->Rsp;
162 frame.AddrFrame.Mode = AddrModeFlat;
163 frame.AddrStack.Offset =
context->Rsp;
164 frame.AddrStack.Mode = AddrModeFlat;
167 if (StackWalk64(IMAGE_FILE_MACHINE_AMD64,
173 SymFunctionTableAccess64,
176 if (frame.AddrPC.Offset) {
181 if (SymFromAddr(GetCurrentProcess(), (DWORD64)(frame.AddrPC.Offset), 0, symbolinfo)) {
182 fprintf(fp,
"%-20s:0x%p %s",
module, (
LPVOID)symbolinfo->Address, symbolinfo->Name);
183 IMAGEHLP_LINE lineinfo;
184 lineinfo.SizeOfStruct =
sizeof(lineinfo);
185 DWORD displacement = 0;
186 if (SymGetLineFromAddr(
187 GetCurrentProcess(), (DWORD64)(frame.AddrPC.Offset), &displacement, &lineinfo)) {
188 fprintf(fp,
" %s:%d", lineinfo.FileName, lineinfo.LineNumber);
196 (
LPVOID)frame.AddrPC.Offset,
197 "Symbols not available");
218 context.ContextFlags = CONTEXT_ALL;
221 if (hThread != GetCurrentThread()) {
222 SuspendThread(hThread);
223 bool success = GetThreadContext(hThread, &
context);
224 ResumeThread(hThread);
226 fprintf(fp,
"Cannot get thread context : 0x0%.8x\n", GetLastError());
238 fprintf(fp,
"Loaded Modules :\n");
239 HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
240 if (hModuleSnap == INVALID_HANDLE_VALUE)
244 me32.dwSize =
sizeof(MODULEENTRY32);
246 if (!Module32First(hModuleSnap, &me32)) {
247 CloseHandle(hModuleSnap);
248 fprintf(fp,
" Error getting module list.\n");
253 if (me32.th32ProcessID == GetCurrentProcessId()) {
254 char version[MAX_PATH];
257 IMAGEHLP_MODULE64 m64;
258 m64.SizeOfStruct =
sizeof(m64);
259 if (SymGetModuleInfo64(GetCurrentProcess(), (DWORD64)me32.modBaseAddr, &m64)) {
261 "0x%p %-20s %s %s %s\n",
266 m64.PdbUnmatched ?
"[unmatched]" :
"");
269 fprintf(fp,
"0x%p %-20s %s\n", me32.modBaseAddr, version, me32.szModule);
272 }
while (Module32Next(hModuleSnap, &me32));
277 fprintf(fp,
"Threads:\n");
278 HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
281 hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
282 if (hThreadSnap == INVALID_HANDLE_VALUE) {
283 fprintf(fp,
"Unable to retrieve threads list.\n");
287 te32.dwSize =
sizeof(THREADENTRY32);
289 if (!Thread32First(hThreadSnap, &te32)) {
290 CloseHandle(hThreadSnap);
294 if (te32.th32OwnerProcessID == GetCurrentProcessId()) {
295 if (GetCurrentThreadId() != te32.th32ThreadID) {
296 fprintf(fp,
"Thread : %.8x\n", te32.th32ThreadID);
297 HANDLE ht = OpenThread(THREAD_ALL_ACCESS,
FALSE, te32.th32ThreadID);
302 }
while (Thread32Next(hThreadSnap, &te32));
303 CloseHandle(hThreadSnap);
308 fprintf(fp,
"Stack trace:\n");
324 IMAGEHLP_MODULE64 m64;
325 m64.SizeOfStruct =
sizeof(m64);
326 if (SymGetModuleInfo64(GetCurrentProcess(), (DWORD64)GetModuleHandle(
NULL), &m64)) {
327 return m64.GlobalSymbols;
339 char pdb_file[MAX_PATH] = {0};
342 if (GetModuleFileNameA(
NULL, pdb_file,
sizeof(pdb_file))) {
344 PathRemoveFileSpecA(pdb_file);
346 PathAppendA(pdb_file,
"blender.pdb");
347 if (PathFileExistsA(pdb_file)) {
348 HMODULE
mod = GetModuleHandle(
NULL);
350 WIN32_FILE_ATTRIBUTE_DATA file_data;
351 if (GetFileAttributesExA(pdb_file, GetFileExInfoStandard, &file_data)) {
354 SymUnloadModule64(GetCurrentProcess(), (DWORD64)
mod);
356 DWORD64 module_base = SymLoadModule(GetCurrentProcess(),
361 (DWORD)file_data.nFileSizeLow);
362 if (module_base == 0) {
364 "Error loading symbols %s\n\terror:0x%.8x\n\tsize = %d\n\tbase=0x%p\n",
367 file_data.nFileSizeLow,
378 SymInitialize(GetCurrentProcess(),
NULL, TRUE);
400 LPVOID address = exception->ExceptionRecord->ExceptionAddress;
401 fprintf(stderr,
"Address : 0x%p\n", address);
403 CHAR modulename[MAX_PATH];
405 fprintf(stderr,
"Module : %s\n", modulename);
406 fprintf(stderr,
"Thread : %.8x\n", GetCurrentThreadId());
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
Read Guarded memory(de)allocation.
static struct PyModuleDef module
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
struct SELECTID_Context context
static void bli_windows_get_module_version(const char *file, char *buffer, size_t buffersize)
static bool bli_windows_system_backtrace_stack_thread(FILE *fp, HANDLE hThread)
static const char * bli_windows_get_exception_description(const DWORD exceptioncode)
static void bli_windows_get_module_name(LPVOID address, PCHAR buffer, size_t size)
static void bli_windows_system_backtrace_modules(FILE *fp)
static void bli_windows_system_backtrace_exception_record(FILE *fp, PEXCEPTION_RECORD record)
static bool bli_private_symbols_loaded()
void BLI_windows_handle_exception(EXCEPTION_POINTERS *exception)
void BLI_system_backtrace(FILE *fp)
static EXCEPTION_POINTERS * current_exception
static void bli_windows_system_backtrace_threads(FILE *fp)
static bool BLI_windows_system_backtrace_stack(FILE *fp)
static void bli_load_symbols()
static bool BLI_windows_system_backtrace_run_trace(FILE *fp, HANDLE hThread, PCONTEXT context)
ccl_device_inline int mod(int x, int m)