/* * Copyright (C) 2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #ifdef ENABLE_DYNAMIC_MEMORY_TRACKING #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const bool enableBacktrace = true; constexpr u_int32_t backtraceBufferSize = 256; void collectBacktrace() { void *addressess[backtraceBufferSize]; char **functions; auto pointersCount = backtrace(addressess, backtraceBufferSize); functions = backtrace_symbols(addressess, pointersCount); printf("\n backtrace collected -- START --\n"); for (int symbolId = 0; symbolId < pointersCount; symbolId++) { Dl_info info; dladdr(addressess[symbolId], &info); char *realname; int status; realname = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); if (realname) { printf("%s %s\n", info.dli_fname, realname); } else { printf("%s %s\n", functions[symbolId], info.dli_sname); } free(realname); } printf(" backtrace collected -- END --"); free(functions); } void *operator new(size_t size) { if (enableBacktrace) { collectBacktrace(); } return malloc(size); } void *operator new(size_t size, const std::nothrow_t &) noexcept { if (enableBacktrace) { collectBacktrace(); } return malloc(size); } void *operator new[](size_t size) { if (enableBacktrace) { collectBacktrace(); } return malloc(size); } void *operator new[](size_t size, const std::nothrow_t &t) noexcept { if (enableBacktrace) { collectBacktrace(); } return malloc(size); } void operator delete(void *p) noexcept { free(p); } void operator delete[](void *p) noexcept { free(p); } void operator delete(void *p, size_t size) noexcept { free(p); } void operator delete[](void *p, size_t size) noexcept { free(p); } #endif