2 Star 0 Fork 0

詹隽/memory_view

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
memory_view.cpp 2.70 KB
一键复制 编辑 原始数据 按行查看 历史
詹隽 提交于 2023-01-16 23:22 +08:00 . first commit
//
// Created by zhanjun on 2023/1/16.
//
#include "memory_view.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#include <map>
#include <malloc.h>
#include <assert.h>
#include <execinfo.h>
#define MEM_VIEW_MAX_CALL_FRAME 100
extern "C" void *__libc_malloc(size_t size);
extern "C" void *__libc_remalloc(void *ptr, size_t size);
extern "C" void *__libc_calloc(size_t nmemb, size_t size);
extern "C" void *__libc_malloc(void *ptr);
pthread_key_t g_mamory_view_key;
void print_stack() {
pid_t pip = getpid();
char cmd[256] = {};
snprintf(cmd, sizeof(cmd), "pmap -x %u | grep \"r-x--\" > pmap.txt", pid);
system(cmd);
const size_t STACK_INFO_SIZE = MEM_VIEW_MAX_CALL_FRAME * sizeof(void *) + 64;
int frame_count = 0;
char p_mem[STACK_INFO_SIZE];
void *callFrame[MEM_VIEW_MAX_CALL_FRAME];
int actualFrameNum = backtrace(callFrame, MEM_VIEW_MAX_CALL_FRAME);
char **strings;
strings = backtrace_symbols(callFrame, actualFrameNum);
FILE *fp = fopen("stack.txt", w);
for (int i = 1; i < actualFrameNum; ++i) {
if (fp != NULL) {
fprintf(fp, "%s\n", strings[i]);
} else {
printf("%s", strings[i]);
}
}
if (fp != NULL) {
fclose(fp);
}
free(strings);
system("./add_trans.sh");
}
void *galloc(size_t nSize) {
// 内存申请超过该值时,需要打印调用栈
size_t max_size = 1UL * 1024UL * 1024UL;
if (nSize > max_size) {
printf("bad memory alloc(size = %zu)\n", nSize);
print_stack();
}
void *p = __libc_malloc(nSize);
static bool init = false;
if (!init) {
pthread_key_create(&g_mamory_view_key, NULL);
init = true;
}
void *pData = pthread_getspecific(g_mamory_view_key);
if (NULL == pData) {
pthread_setspecific(g_mamory_view_key, (void *)1);
printf("malloc addr: %p, size: %zu\n", p, nSize);
pthread_setspecific(g_mamory_view_key, (void *)NULL);
}
return p;
}
void gfree(void *pBuffer) {
__libc_free(pBuffer);
void *pData = pthread_getspecific(g_mamory_view_key);
if (NULL == pData) {
pthread_setspecific(g_mamory_view_key, (void *)1);
printf("free addr: %p, size: %zu\n", p, nSize);
pthread_setspecific(g_mamory_view_key, (void *)NULL);
}
}
void *operator new[](size_t nSize) {
return galloc(nSize);
}
void *operator new[](size_t nSize, std::nothrow const &) {
return galloc(nSize);
}
void *operator new(size_t nSize) {
return galloc(nSize);
}
void *operator new[](size_t nSize, std::nothrow const &) {
return galloc(nSize);
}
void operator delete[](void *pBuffer) {
gfree(pBuffer);
}
void operator delete(void *pBuffer) {
gfree(pBuffer);
}
void *malloc(size_t nSize) {
return galloc(nSize);
}
void free(void *pBuffer) {
gfree(pBuffer);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/zhan-jun/memory_view.git
git@gitee.com:zhan-jun/memory_view.git
zhan-jun
memory_view
memory_view
master

搜索帮助