Backtrace 在 Linux x86_64 上如何工作?

发布于 2024-12-24 18:33:53 字数 318 浏览 1 评论 0原文

我有几个问题:

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

i have several questions:

  1. int backtrace(void **buffer, int size);
    Here buffer is array of pointers. and the array elements on returns points to each frame of stack in return. So, backtrace() internally calls malloc() number of times as that of number of frames? why this is for?
  2. the above allocated memory is not freed() from backtrace(), So, who release this memory?
  3. is there any way, to avoid malloc() from inside backtrace()?
  4. where can i find backtrace() source code?
  5. how can i write code to backtrace in assembly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉城 2024-12-31 18:33:53

请仔细阅读手册页以了解回溯。您似乎误解了一些基本原理:

  1. 不,array您的指针缓冲区,由backtrace() 填充指向堆栈帧。不会调用malloc()
  2. 你,因为那是你的记忆。
  3. 不适用,backtrace() 不会调用 malloc()
  4. 它是 GNU libc 的一部分。 <一href="http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/ia64/backtrace.c;h=d4 ff29102261505da02e785433197c0518cd110b;hb=a98275aa614e1c5c6d5543295296ce402a9f0244" rel="nofollow">这里是实现的一部分。
  5. 可能是通过复制堆栈指针并手动遍历堆栈。

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

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

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

Please read the manual page for backtrace a bit more carefully. You seem to be mistaken about some of the fundamentals:

  1. No, array is your buffer of pointers, which are filled-in by backtrace() to point at the stack frames. No calls to malloc() are made.
  2. You, since it's your memory.
  3. Not applicable, backtrace() does not call malloc().
  4. It's part of GNU libc. Here is one part of the implementation.
  5. Probably by copying the stack pointer and manually walking the stack.

You seem to confuse backtrace() with backtrace_symbols(), the latter involves memory allocations.

To read out the current backtrace up to a maximum of 64 levels, just do:

void *stack[64];
const int depth = backtrace(stack, sizeof stack / sizeof *stack);
絕版丫頭 2024-12-31 18:33:53

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

Apparently, the GNU backtrace() function calls malloc() once -- and then never calls it again. If one examines the source, one sees that backtrace() invokes several "dl" functions to unwind the stack, and one of those must be calling malloc(). I agree that malloc() is being called. I get around the problem when I load my heapmanager hooks by calling backtrace() once during the initialization phase so I can avoid a recursive call to the hooked malloc() function as I attempt to develop the list of calling sequences in my software associated with the heap.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文