微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我将在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] 举报,一经查实,本站将立刻删除。

相关推荐