以较less的开销获取代码中的调用堆栈?

我将在linux上实现内存分析器。 我想保存每个malloc / free / realloc的堆栈。 我正尝试使用“pstack”来获取堆栈跟踪每次。 但是开销太高了。 有没有轻量级的方法来获取C代码中的调用堆栈?

我知道有一些工具,如“valgrind,谷歌分析器”,但不知道他们如何重新为每个行动的堆栈。

任何意见表示赞赏。

谢谢。

你可以使自己的功能来打电话给:

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本身的递归。

另外请注意,在第一次使用backtrace()和朋友时,动态链接器将尝试加载libgcc,它将再次调用malloc。

吉拉德

现在我遇到了64位的问题。

在64位上,RBP没有严格维护。 例如,gcc -O3将使用RBP作为正常的主叫保存寄存器。 所以在这种情况下,从帧指针调用堆栈不起作用。:(

任何意见?