faster backtrace; show predecessor blocks on block overflow

This commit is contained in:
Daan 2021-12-10 17:22:02 -08:00
parent 5739714b8d
commit 72ca23d14f
2 changed files with 9 additions and 7 deletions

View file

@ -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

View file

@ -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: <unknown address: error: 0x%04x>\n", i, strace[i], GetLastError());
}
}
SymCleanup(current_process);
}
#elif (MI_DEBUG_TRACE > 0) && (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__))
#include <execinfo.h>
#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);