backtrace() 陷入无限递归?
backtrace() falls into endless recursion?
我在一个自定义的malloc()中使用了backtrace()函数,像这样:
void *malloc(size_t size)
{printf("my malloc!\n");
//map_insert
static void *(*mallocp)(size_t size);
char *error;
void *ptr;
void *buffer[100];
int nptrs;
char ptrs_num[10];
memset(ptrs_num, '[=10=]', 10);
char **strings;
printf("1\n");
nptrs = backtrace(buffer, 100);
/* those code below seems useless because problem happens here*/
printf("2\n");
printf("backtrace() returned %d addresses\n", nptrs);
printf("3\n");
strings = backtrace_symbols(buffer, nptrs);
printf("4\n");
if (strings == NULL) {
perror("backtrace_symbols");
exit(1);
}
/*code neglected*/
return ptr;
}
这是我的 .so 文件中的部分代码,可能存在一些错误,因为我没有 运行 这个和修改。我使用这个测试代码:
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
int main(int argc, char **argv){
printf("to malloc a!\n");
char *a=(char *)malloc(sizeof(int)*1024);
return 0;
}
我的结果如下:
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
Segmentation fault
我真的不知道这是为什么。
我认为 backtrace 只是获取一些信息,为什么它会触发我的 malloc?
backtrace()
呼叫 malloc()
。有一个递归调用你的 hook malloc 函数。这是一个已知的问题。为了使用 malloc() 中的 backtrace(),您可以设置一个标志,指示它是从您的挂钩函数中调用的,如果是这样,分配并 return 通过使用 malloc 以外的其他机制请求的内存() 比如使用mmap()
、brk()
等
另见:https://sourceware.org/ml/libc-alpha/2015-02/msg00653.html
我在一个自定义的malloc()中使用了backtrace()函数,像这样:
void *malloc(size_t size)
{printf("my malloc!\n");
//map_insert
static void *(*mallocp)(size_t size);
char *error;
void *ptr;
void *buffer[100];
int nptrs;
char ptrs_num[10];
memset(ptrs_num, '[=10=]', 10);
char **strings;
printf("1\n");
nptrs = backtrace(buffer, 100);
/* those code below seems useless because problem happens here*/
printf("2\n");
printf("backtrace() returned %d addresses\n", nptrs);
printf("3\n");
strings = backtrace_symbols(buffer, nptrs);
printf("4\n");
if (strings == NULL) {
perror("backtrace_symbols");
exit(1);
}
/*code neglected*/
return ptr;
}
这是我的 .so 文件中的部分代码,可能存在一些错误,因为我没有 运行 这个和修改。我使用这个测试代码:
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
int main(int argc, char **argv){
printf("to malloc a!\n");
char *a=(char *)malloc(sizeof(int)*1024);
return 0;
}
我的结果如下:
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
my malloc!
1
Segmentation fault
我真的不知道这是为什么。
我认为 backtrace 只是获取一些信息,为什么它会触发我的 malloc?
backtrace()
呼叫 malloc()
。有一个递归调用你的 hook malloc 函数。这是一个已知的问题。为了使用 malloc() 中的 backtrace(),您可以设置一个标志,指示它是从您的挂钩函数中调用的,如果是这样,分配并 return 通过使用 malloc 以外的其他机制请求的内存() 比如使用mmap()
、brk()
等
另见:https://sourceware.org/ml/libc-alpha/2015-02/msg00653.html