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