我有几个问题:
请仔细阅读manual page的回溯。你似乎误解了一些基本原则:
array
是指针的缓冲区,由backtrace()
填充指向堆栈帧。没有打电话给malloc()
。backtrace()
不会打电话给malloc()
。你似乎把backtrace()
和backtrace_symbols()
混为一谈,后者涉及内存分配。
要读出当前回溯最多64个级别,只需执行以下操作:
void *stack[64];
const int depth = backtrace(stack, sizeof stack / sizeof *stack);
显然,GNU backtrace()
函数调用malloc()
一次 - 然后再也不会调用它。如果检查源,可以看到backtrace()调用几个“dl”函数来展开堆栈,其中一个必须调用malloc()。我同意malloc()
被召唤。当我在初始化阶段通过调用heapmanager
加载我的backtrace()
钩子时,我解决了这个问题所以我可以避免递归调用钩子的malloc()
函数,因为我尝试在与堆相关联的软件中开发调用序列列表。