mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-09 08:49:31 +03:00
faster backtrace; show predecessor blocks on block overflow
This commit is contained in:
parent
5739714b8d
commit
72ca23d14f
2 changed files with 9 additions and 7 deletions
|
@ -61,7 +61,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(MI_DEBUG_TRACE) // store stack trace at each allocation
|
#if !defined(MI_DEBUG_TRACE) // store stack trace at each allocation
|
||||||
#define MI_DEBUG_TRACE MI_DEBUG
|
#define MI_DEBUG_TRACE (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(MI_DEBUG_TRACE_LEN)
|
#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 !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
|
#if MI_DEBUG_TRACE > 0
|
||||||
#define MI_PADDING_EXTRA (128)
|
#define MI_PADDING_EXTRA (64)
|
||||||
#else
|
#else
|
||||||
#define MI_PADDING_EXTRA (0)
|
#define MI_PADDING_EXTRA (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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) {
|
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",
|
_mi_fprintf(NULL, NULL, "trace %s at %p of size %zu (%zub usable), allocated at:\n",
|
||||||
(msg==NULL ? "block" : msg), block, avail, bsize);
|
(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));
|
PSYMBOL_INFO info = (PSYMBOL_INFO)_malloca(sizeof(SYMBOL_INFO) + 256 * sizeof(TCHAR));
|
||||||
if (info==NULL) return;
|
if (info==NULL) return;
|
||||||
memset(info, 0, sizeof(info));
|
memset(info, 0, sizeof(info));
|
||||||
info->MaxNameLen = 255;
|
info->MaxNameLen = 255;
|
||||||
info->SizeOfStruct = sizeof(SYMBOL_INFO);
|
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++) {
|
for (size_t i = 0; i < len && strace[i] != NULL; i++) {
|
||||||
if (SymFromAddr(current_process, (DWORD64)(strace[i]), 0, info)) {
|
if (SymFromAddr(current_process, (DWORD64)(strace[i]), 0, info)) {
|
||||||
_mi_fprintf(NULL, NULL, " %2zu: %8p: %s\n", i, strace[i], info->Name);
|
_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());
|
_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__))
|
#elif (MI_DEBUG_TRACE > 0) && (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__))
|
||||||
#include <execinfo.h>
|
#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) {
|
void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) {
|
||||||
if (_mi_preloading()) return;
|
if (_mi_preloading()) return;
|
||||||
if (!mi_recurse_enter()) return; // needed for pthreads
|
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;
|
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);
|
memset(trace,0,trace_len);
|
||||||
trace_len = backtrace(trace, trace_len);
|
trace_len = backtrace(trace, trace_len);
|
||||||
for (size_t i = 0; i < len; i++) {
|
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();
|
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) {
|
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",
|
_mi_fprintf(NULL, NULL, "trace %s at %p of size %zu (%zub usable), allocated at:\n",
|
||||||
(msg==NULL ? "block" : msg), block, avail, bsize);
|
(msg==NULL ? "block" : msg), block, avail, bsize);
|
||||||
|
|
Loading…
Add table
Reference in a new issue