kimi:如何分析是哪个接口调用了最多次的operator new[]接口?
如何分析是哪个接口调用了最多次的operator new[]接口?
重载 operator new[]:你可以在你的程序中重载 operator new[],记录每次调用时的调用栈信息。
#include <iostream>
#include <fstream>
#include <new>
#include <cstdlib>
#include <execinfo.h> // 包含 backtrace 函数
#include <dlfcn.h> // 包含 dladdr 函数,用于解析符号信息
// 重载 operator new[]
void* operator new[](std::size_t size) {
void* ptr = malloc(size);
if (ptr == nullptr) {
throw std::bad_alloc();
}
// 获取调用栈信息
void* buffer[10];
int nptrs = backtrace(buffer, 10);
char** symbols = backtrace_symbols(buffer, nptrs);
// 打开文件流
std::ofstream logFile("allocations.log", std::ios::app); // 以追加模式打开
if (!logFile) {
std::cerr << "Failed to open allocations.log" << std::endl;
free(symbols);
return ptr;
}
// 写入调用栈信息到文件
logFile << "Allocated " << size << " bytes at " << ptr << std::endl;
for (int i = 0; i < nptrs; i++) {
logFile << symbols[i] << std::endl;
}
// 关闭符号表
free(symbols);
// 关闭文件流
logFile.close();
return ptr;
}
// 重载 operator delete[]
void operator delete[](void* ptr) noexcept {
free(ptr);
}
int main() {
int* arr = new int[10];
delete[] arr;
return 0;
}