题
我要实现用于在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作为一个正常的呼叫方保存的寄存器。因此,在这种情况下,要得到调用从帧指针堆栈不工作:(
任何意见?
不隶属于 StackOverflow