Backtrace如何在Linux x86_64上运行?

时间:2012-01-04 09:47:55

标签: c linux backtrace

我有几个问题:

  1. int backtrace(void ** buffer,int size); 这里缓冲区是指针数组。并且返回的数组元素返回指向堆栈的每个帧。那么,backtrace()内部调用malloc()的次数是多少帧的?为什么这是为了?
  2. 上面分配的内存没有从backtrace()释放(),那么,谁释放了这个内存?
  3. 有什么办法可以避免来自backtrace()内的malloc()?
  4. 我在哪里可以找到backtrace()源代码?
  5. 如何在汇编中编写代码来回溯?

2 个答案:

答案 0 :(得分:4)

请仔细阅读manual page进行回溯。你似乎误解了一些基本原则:

  1. 不,array指针的缓冲区,由backtrace()填充以指向堆栈帧。没有拨打malloc()
  2. 你,因为这是你的记忆。
  3. 不适用,backtrace()不会致电malloc()
  4. 它是GNU libc的一部分。 Here是实施的一部分。
  5. 可能通过复制堆栈指针并手动移动堆栈。
  6. 您似乎将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()函数与堆关联的软件中的调用序列数量。