我要实现用于在Linux存储器内部分析器。我想保存在堆栈每个的malloc /免费/ realloc的。我试图用“的pstack”来获得堆栈跟踪每次。但是开销过高。有没有什么办法轻量级获得C代码调用堆栈?

我知道有一些像“Valgrind的,谷歌事件探查器”的工具,但不知道他们是如何remebmer堆栈的每一个动作。

任何注释理解。

感谢。

有帮助吗?

解决方案

您可以使自己的函数来获取主叫方:

static inline void *get_caller(void) {
    unsigned long *ebp;

    /* WARNING: This is working only with frame pointers */
    asm ("movl %%ebp, %0" : "=r" (ebp) : );
    ebp = (unsigned long*)*ebp;
    ebp = (unsigned long*)*(ebp+1);
    return ebp;
}

void *malloc(void) {
    void *caller = get_caller();
    ...    
}

ebp = (unsigned long*)*ebp;”将让你通过堆栈(如果你需要更多的堆栈跟踪)。

其他提示

有一个GNU函数backtrace()这是比较快的。 - 它只是返回地址的阵列

要解决这些地址的功能,您需要使用backtrace_symbols()这是更重的名字,但希望你并不需要过于频繁地运行它。

要获得backtrace_symbols()真正解决你需要使用-rdynamic连接选项的名称。

详见man backtrace

当心与backtrace_symbols()递归,其调用malloc本身。

另外请注意,在第一次使用回溯()和朋友的动态连接器将尝试加载libgcc中,这将再次调用malloc的。

吉拉德

现在我满足的问题在64位。

在64位,RBP是不严格保持。例如,GCC -O3将使用RBP作为一个正常的呼叫方保存的寄存器。因此,在这种情况下,要得到调用从帧指针堆栈不工作:(

任何意见?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top