我的日志记录代码使用的返回值回溯() http://linux.die.net/man/3/backtrace确定当前堆栈深度(出于漂亮的打印目的),但我可以从分析中看到这是一个相当昂贵的调用。
我不认为有更便宜的方法吗?请注意,我不关心帧地址,只关心它们有多少。
编辑:这些日志记录函数在大型代码库中使用,因此手动跟踪堆栈深度并不是真正的选择。
自己遍历堆栈非常快 - 大部分速度都很慢backtrace()
来自查找符号名称。在 x86 上,您可以执行以下操作:
inline uint32_t get_ebp(void)
{
__asm__ __volatile__("mov %%ebp, %%eax");
}
int get_stack_depth(void)
{
uint32_t ebp = get_ebp();
int stack_depth = 0;
while(ebp != 0)
{
ebp = *(uint32_t *)ebp;
stack_depth++;
}
return stack_depth;
}
这将遍历链ebp
指针。请记住,这是极其不可移植的。另请注意,这不会计算任何已内联或尾部调用优化的函数(当然,backtrace()
有同样的问题)。
另一个重要的问题是终止条件——一旦你回溯到main()
,通常无法保证您会在堆栈中找到什么。因此,如果 libc 没有放置空帧指针,则很可能会出现段错误。您可以通过在最开始查看它来获取终止值main()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)