diff --git a/include/mimalloc-types.h b/include/mimalloc-types.h index adc8ee69..40b6430a 100644 --- a/include/mimalloc-types.h +++ b/include/mimalloc-types.h @@ -61,7 +61,7 @@ terms of the MIT license. A copy of the license can be found in the file #endif #if !defined(MI_DEBUG_TRACE) // store stack trace at each allocation -#define MI_DEBUG_TRACE MI_DEBUG +#define MI_DEBUG_TRACE (0) #endif #if !defined(MI_DEBUG_TRACE_LEN) @@ -70,7 +70,7 @@ terms of the MIT license. A copy of the license can be found in the file #if !defined(MI_PADDING_EXTRA) // use extra padding bytes? (so a stack trace can be preserved or next block corruption prevented) #if MI_DEBUG_TRACE > 0 -#define MI_PADDING_EXTRA (128) +#define MI_PADDING_EXTRA (64) #else #define MI_PADDING_EXTRA (0) #endif diff --git a/src/options.c b/src/options.c index ec541536..978267cd 100644 --- a/src/options.c +++ b/src/options.c @@ -360,13 +360,13 @@ void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) { void _mi_stack_trace_print(const char* msg, void** strace, size_t len, const mi_block_t* block, size_t bsize, size_t avail) { _mi_fprintf(NULL, NULL, "trace %s at %p of size %zu (%zub usable), allocated at:\n", (msg==NULL ? "block" : msg), block, avail, bsize); - HANDLE current_process = GetCurrentProcess(); - SymInitialize(current_process, NULL, TRUE); PSYMBOL_INFO info = (PSYMBOL_INFO)_malloca(sizeof(SYMBOL_INFO) + 256 * sizeof(TCHAR)); if (info==NULL) return; memset(info, 0, sizeof(info)); info->MaxNameLen = 255; info->SizeOfStruct = sizeof(SYMBOL_INFO); + HANDLE current_process = GetCurrentProcess(); + if (!SymInitialize(current_process, NULL, TRUE)) return; for (size_t i = 0; i < len && strace[i] != NULL; i++) { if (SymFromAddr(current_process, (DWORD64)(strace[i]), 0, info)) { _mi_fprintf(NULL, NULL, " %2zu: %8p: %s\n", i, strace[i], info->Name); @@ -375,16 +375,17 @@ void _mi_stack_trace_print(const char* msg, void** strace, size_t len, const mi_ _mi_fprintf(NULL, NULL, " %2zu: %8p: \n", i, strace[i], GetLastError()); } } + SymCleanup(current_process); } #elif (MI_DEBUG_TRACE > 0) && (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) #include -#define MI_TRACE_LEN (64) +#define MI_MAX_TRACE_LEN (64) void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) { if (_mi_preloading()) return; if (!mi_recurse_enter()) return; // needed for pthreads - void* trace[MI_TRACE_LEN]; + void* trace[MI_MAX_TRACE_LEN]; size_t trace_len = skip + len; - if (trace_len > len) { trace_len = MI_TRACE_LEN; } + if (trace_len > len) { trace_len = MI_MAX_TRACE_LEN; } memset(trace,0,trace_len); trace_len = backtrace(trace, trace_len); for (size_t i = 0; i < len; i++) { @@ -393,6 +394,7 @@ void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) { } mi_recurse_exit(); } + void _mi_stack_trace_print(const char* msg, void** strace, size_t len, const mi_block_t* block, size_t bsize, size_t avail) { _mi_fprintf(NULL, NULL, "trace %s at %p of size %zu (%zub usable), allocated at:\n", (msg==NULL ? "block" : msg), block, avail, bsize);