gpt4 book ai didi

c - 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:07 26 4
gpt4 key购买 nike

我的日志记录代码使用 backtrace() 的返回值确定当前堆栈深度(用于 pretty-print 目的),但我可以从分析中看出这是一个非常昂贵的调用。

我不认为有更便宜的方法来做到这一点?请注意,我不关心帧地址,只关心它们有多少。

编辑:这些日志记录函数在大型代码库中广泛使用,因此手动跟踪堆栈深度并不是一个真正的选择。

最佳答案

自己遍历堆栈非常快 - 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() 的最开始查看它来获取终止值。

关于c - 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com