c - backtrace() 陷入无限递归?

标签 c glibc backtrace

我在一个自定义的 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, '\0', 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(),您可以设置一个标志,指示它是从您的 Hook 函数中调用的,如果是这样,则使用 malloc() 以外的其他机制分配并返回请求的内存,例如使用 mmap(), brk()

另见:https://sourceware.org/ml/libc-alpha/2015-02/msg00653.html

关于c - backtrace() 陷入无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39877836/

相关文章:

c - 打印数字时出现段错误

c - 有序二叉树插入

c - 为什么 LookupAccountSid 使用 C 在 Win32 API 中提供奇怪的安全描述符数据?

c - Glibc 损坏的双链表

c++ - 什么是 glibc free/malloc/realloc invalid next size/invalid pointer error 以及如何修复它?

macos - 获取 Mac OS X 上的当前堆栈跟踪

c - OpenSSL EVP AES/DES 加密实现

linux - 为什么/lib/ld-linux.so.2 soname版本颠簸如此罕见?

c - ARM 平台上没有来自 SIGABRT 信号的回溯?

linux - 为什么 "echo l >/proc/sysrq-trigger"调用跟踪输出总是相似的?