提交 2914408d 编写于 作者: wafwerar's avatar wafwerar

[TD-13758]<fix>: modify the stack fetch.

上级 6a773532
...@@ -20,13 +20,12 @@ ...@@ -20,13 +20,12 @@
#define TD_MEMORY_SYMBOL ('T'<<24|'A'<<16|'O'<<8|'S') #define TD_MEMORY_SYMBOL ('T'<<24|'A'<<16|'O'<<8|'S')
#define TEST_SIZE 4 #define TD_MEMORY_STACK_TRACE_DEPTH 10
typedef struct TdMemoryInfo typedef struct TdMemoryInfo
{ {
int32_t symbol; int32_t symbol;
char **stackTrace; void *stackTrace[TD_MEMORY_STACK_TRACE_DEPTH]; // gdb: disassemble /m 0xXXX
int32_t stackTraceDepth;
int32_t memorySize; int32_t memorySize;
} *TdMemoryInfoPtr , TdMemoryInfo; } *TdMemoryInfoPtr , TdMemoryInfo;
...@@ -36,7 +35,7 @@ typedef struct TdMemoryInfo ...@@ -36,7 +35,7 @@ typedef struct TdMemoryInfo
#include<execinfo.h> #include<execinfo.h>
#define STACKCALL __attribute__((regparm(1), noinline)) #define STACKCALL __attribute__((regparm(1), noinline))
void **STACKCALL taosGetEBP(void) { void **STACKCALL taosGetEbp(void) {
void **ebp = NULL; void **ebp = NULL;
__asm__ __volatile__("mov %%rbp, %0;\n\t" __asm__ __volatile__("mov %%rbp, %0;\n\t"
: "=m"(ebp) /* output */ : "=m"(ebp) /* output */
...@@ -50,7 +49,7 @@ int32_t taosBackTrace(void **buffer, int32_t size) { ...@@ -50,7 +49,7 @@ int32_t taosBackTrace(void **buffer, int32_t size) {
void **ret = NULL; void **ret = NULL;
unsigned long long func_frame_distance = 0; unsigned long long func_frame_distance = 0;
if (buffer != NULL && size > 0) { if (buffer != NULL && size > 0) {
ebp = taosGetEBP(); ebp = taosGetEbp();
func_frame_distance = (unsigned long long)(*ebp) - (unsigned long long)ebp; func_frame_distance = (unsigned long long)(*ebp) - (unsigned long long)ebp;
while (ebp && frame < size && (func_frame_distance < (1ULL << 24)) // assume function ebp more than 16M while (ebp && frame < size && (func_frame_distance < (1ULL << 24)) // assume function ebp more than 16M
&& (func_frame_distance > 0)) { && (func_frame_distance > 0)) {
...@@ -64,11 +63,11 @@ int32_t taosBackTrace(void **buffer, int32_t size) { ...@@ -64,11 +63,11 @@ int32_t taosBackTrace(void **buffer, int32_t size) {
} }
#endif #endif
char **taosBackTraceSymbols(int32_t *size) { // char **taosBackTraceSymbols(int32_t *size) {
void *buffer[20] = {NULL}; // void *buffer[20] = {NULL};
*size = taosBackTrace(buffer, 10); // *size = taosBackTrace(buffer, 20);
return backtrace_symbols(buffer, *size); // return backtrace_symbols(buffer, *size);
} // }
void *taosMemoryMalloc(int32_t size) { void *taosMemoryMalloc(int32_t size) {
void *tmp = malloc(size + sizeof(TdMemoryInfo)); void *tmp = malloc(size + sizeof(TdMemoryInfo));
...@@ -77,7 +76,7 @@ void *taosMemoryMalloc(int32_t size) { ...@@ -77,7 +76,7 @@ void *taosMemoryMalloc(int32_t size) {
TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)tmp; TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)tmp;
pTdMemoryInfo->memorySize = size; pTdMemoryInfo->memorySize = size;
pTdMemoryInfo->symbol = TD_MEMORY_SYMBOL; pTdMemoryInfo->symbol = TD_MEMORY_SYMBOL;
pTdMemoryInfo->stackTrace = taosBackTraceSymbols(&pTdMemoryInfo->stackTraceDepth); taosBackTrace(pTdMemoryInfo->stackTrace,TD_MEMORY_STACK_TRACE_DEPTH);
return (char*)tmp + sizeof(TdMemoryInfo); return (char*)tmp + sizeof(TdMemoryInfo);
} }
...@@ -90,7 +89,7 @@ void *taosMemoryCalloc(int32_t num, int32_t size) { ...@@ -90,7 +89,7 @@ void *taosMemoryCalloc(int32_t num, int32_t size) {
TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)tmp; TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)tmp;
pTdMemoryInfo->memorySize = memorySize; pTdMemoryInfo->memorySize = memorySize;
pTdMemoryInfo->symbol = TD_MEMORY_SYMBOL; pTdMemoryInfo->symbol = TD_MEMORY_SYMBOL;
pTdMemoryInfo->stackTrace = taosBackTraceSymbols(&pTdMemoryInfo->stackTraceDepth); taosBackTrace(pTdMemoryInfo->stackTrace,TD_MEMORY_STACK_TRACE_DEPTH);
return (char*)tmp + sizeof(TdMemoryInfo); return (char*)tmp + sizeof(TdMemoryInfo);
} }
...@@ -118,7 +117,6 @@ void taosMemoryFree(const void *ptr) { ...@@ -118,7 +117,6 @@ void taosMemoryFree(const void *ptr) {
TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)((char*)ptr - sizeof(TdMemoryInfo)); TdMemoryInfoPtr pTdMemoryInfo = (TdMemoryInfoPtr)((char*)ptr - sizeof(TdMemoryInfo));
if(pTdMemoryInfo->symbol == TD_MEMORY_SYMBOL) { if(pTdMemoryInfo->symbol == TD_MEMORY_SYMBOL) {
if(pTdMemoryInfo->stackTrace != NULL) free(pTdMemoryInfo->stackTrace);
memset(pTdMemoryInfo, 0, sizeof(TdMemoryInfo)); memset(pTdMemoryInfo, 0, sizeof(TdMemoryInfo));
free(pTdMemoryInfo); free(pTdMemoryInfo);
} else { } else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册