我将在linux上实现内存分析器。 我想保存每个malloc / free / realloc的堆栈。 我正尝试使用“pstack”来获取堆栈跟踪每次。 但是开销太高了。 有没有轻量级的方法来获取C代码中的调用堆栈?
我知道有一些工具,如“valgrind,谷歌分析器”,但不知道他们如何重新为每个行动的堆栈。
任何意见表示赞赏。
谢谢。
CUDA – 关于“分支”和“分支”Visual Profiler结果的混淆(2)
在Linux上用C ++开发一个简单易用的分析器是什么?
在Linux中分析部分程序
铛静态分析器的一些跳棋不能在linux下工作
如何在Linux上剖析我的C ++应用程序
如何configuration内存使用情况?
C ++代码分析器
Windows任务pipe理器显示内存使用不正确?
Windows性能分析工具用作分析器
剖析由Ruby程序调用的C共享库
你可以使自己的功能来打电话给:
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作为正常的主叫保存寄存器。 所以在这种情况下,从帧指针调用堆栈不起作用。:(
任何意见?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。