-4

我有几个问题:

  1. int backtrace(void **buffer, int size); 这里的缓冲区是指针数组。return 上的数组元素作为 return 指向栈的每一帧。那么,backtrace() 内部调用 malloc() 的次数是帧数吗?为什么这是为了?
  2. 上面分配的内存不是从 backtrace() 中 freed() 的,那么,谁来释放这块内存呢?
  3. 有什么办法可以避免来自 backtrace() 内部的 malloc()?
  4. 我在哪里可以找到 backtrace() 源代码?
  5. 我如何编写代码以在程序集中进行回溯?
4

2 回答 2

4

请更仔细地阅读回溯的手册页。您似乎对一些基本原理有误:

  1. 不,array的指针缓冲区,它们被填充backtrace()以指向堆栈帧。没有调用malloc()
  2. 你,因为这是你的记忆。
  3. 不适用,backtrace()不调用malloc()
  4. 它是 GNU libc 的一部分。是实现的一部分。
  5. 可能是通过复制堆栈指针并手动遍历堆栈。

您似乎与 混淆backtrace()backtrace_symbols(),后者涉及内存分配。

要读取最多 64 个级别的当前回溯,只需执行以下操作:

void *stack[64];
const int depth = backtrace(stack, sizeof stack / sizeof *stack);
于 2012-01-04T09:56:06.637 回答
0

显然,GNUbacktrace()函数调用malloc()一次——然后再也不会调用它。如果检查源代码,就会发现 backtrace() 调用了几个“dl”函数来展开堆栈,其中一个必须调用 malloc()。我同意malloc()正在调用。当我通过在初始化阶段调用一次来加载我的heapmanager钩子时,我解决了这个问题,这样当我尝试在与堆关联的软件中开发调用序列列表时,backtrace()我可以避免对钩子函数的递归调用。malloc()

于 2019-03-06T05:36:32.400 回答