关于C#:Backtrace如何在Linux x86_64上工作?

How Backtrace works on Linux x86_64?

我有几个问题:

  • int backtrace(void ** buffer,int size);
    这里的缓冲区是指针数组。 返回的数组元素指向返回的堆栈的每一帧。 那么,backtrace()内部调用malloc()的次数与帧数的次数一样吗? 为什么这样做?
  • 上面分配的内存不是从backtrace()释放的(),那么,谁释放此内存?
  • 有什么办法可以避免从backtrace()内部获取malloc()?
  • 在哪里可以找到backtrace()源代码?
  • 如何在汇编中编写代码以回溯?

  • 请仔细阅读手册页以了解回溯。您似乎对某些基本概念有误:

  • 不,array是指针的缓冲区,由backtrace()填充以指向堆栈帧。没有调用malloc()
  • 您,因为这是您的记忆。
  • 不适用,backtrace()不会调用malloc()
  • 它是GNU libc的一部分。这是实现的一部分。
  • 可能是通过复制堆栈指针并手动遍历堆栈。
  • 您似乎将backtrace()backtrace_symbols()混淆了,后者涉及内存分配。

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

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


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