Backtrace如何在Linux x86_64上运行?

问题描述 投票:-5回答:2

我有几个问题:

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

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

  1. 不,array是指针的缓冲区,由backtrace()填充指向堆栈帧。没有打电话给malloc()
  2. 你,因为这是你的记忆。
  3. 不适用,backtrace()不会打电话给malloc()
  4. 它是GNU libc的一部分。 Here是实施的一部分。
  5. 可能是通过复制堆栈指针并手动移动堆栈。

你似乎把backtrace()backtrace_symbols()混为一谈,后者涉及内存分配。

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

void *stack[64];
const int depth = backtrace(stack, sizeof stack / sizeof *stack);

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.