How Backtrace works on Linux x86_64?
我有几个问题:
int backtrace(void ** buffer,int size);
这里的缓冲区是指针数组。 返回的数组元素指向返回的堆栈的每一帧。 那么,backtrace()内部调用malloc()的次数与帧数的次数一样吗? 为什么这样做?
上面分配的内存不是从backtrace()释放的(),那么,谁释放此内存?
有什么办法可以避免从backtrace()内部获取malloc()?
在哪里可以找到backtrace()源代码?
如何在汇编中编写代码以回溯?
-
-1:我的2008-06-14联机帮助页(以及早期版本)明确回答了问题1和2。 说明,第2段:"且必须由调用方释放"。
-
您能否让我知道如何以及在哪里找到"我的2008-06-14手册"?
-
在任何linux系统的shell(在终端中)中运行man backtrace。 手册页是所有系统和核心C库功能的权威信息来源。
-
这给出了backtrace命令的描述,而不是功能backtrace()的描述。 再次,在线文档谈论的是释放backtrace_symbol()的内存,而不是backtrace()...,并且没有写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); |
-
@backtrace()不调用malloc()。 -在回溯调用之前,我已经向malloc()添加了一个钩子,当我调用backtrace()时,已调用了malloc的钩子。 并且回溯未能重新调整堆栈。 但是,当我专门从我的HOok函数调用malloc并从中返回分配的内存时,backtrace又成功了..当我免费添加钩子时,它没有被调用..它导致我得出以上几点。 当我阅读文档时,我也以您为前提,现在自己进行了验证。
显然,GNU backtrace()函数调用malloc()一次-然后再也不会调用它。如果检查源代码,就会发现backtrace()调用了几个" dl"函数来展开堆栈,其中之一必须正在调用malloc()。我同意正在调用malloc()。在初始化阶段通过一次调用backtrace()加载我的heapmanager钩子时,我可以解决这个问题,因此当我尝试在软件中开发调用序列列表时,可以避免对钩子malloc()函数进行递归调用与堆关联。