有人可以提供一个C函数的实现,它被调用来转储当前堆栈吗?它适用于x86 linux系统。它可以通过两种方式调用:明确地由另一个函数调用,或者在崩溃后调用(可能作为陷阱/ int处理程序)。输出可以是屏幕或文件,如参数(句柄)所示。一个清楚的解释/评论堆栈如何解开显然是非常有用的。谢谢。是否有一个函数可以在C中调用堆栈转储?
3
A
回答
2
以下是Adam的回答,显示如何执行实际堆栈回溯的源代码位于/libc/debug/backtrace.c下的gnu libc的backtrace()中 - 不确定下面的完整链接是否会被接受计算器的HTML过滤器...
2
的回溯()函数的文档是在GNU LIBC MANUAL。
0
当函数调用嵌套时,堆栈向下增长并构建一系列堆栈帧。在程序中的任何给定点上,理论上可以将栈帧序列回溯到原始的调用点。 backtrace()
函数将堆栈帧从调用点导航到程序的开始处,并提供一组返回地址。在glibc库中的backtrace()
的实现包含每个平台的平台特定代码。
在x86平台的情况下,ebp(基址指针)和esp(堆栈指针)CPU寄存器的内容,它们保存当前堆栈帧的地址和任何给定函数的堆栈指针用于跟随指针链并移动到初始堆栈帧。这允许收集返回地址序列以建立回溯。
如果你想知道如何backtrace()
工作以及如何使用它,我会推荐阅读Stack Backtracing Inside Your Program(Linux杂志)的更多信息。
既然你提到执行从一个x86平台的信号处理回溯,我想向您添加到Adam's answer并直接向my response的问题,他挂了如何确保回溯细节从信号处理程序指向故障的实际位置。
相关问题
- 1. 是否可以添加一些堆栈到一个大堆栈?
- 2. 是否可以在JavaScript中保存/恢复调用堆栈?
- 3. Python是否可以重新创建整个调用堆栈?
- 4. 'this'引用是否存储在Java的调用堆栈中?
- 5. OpenCL - 是否可以在内核中调用另一个函数?
- 6. 是否可以在一个case语句中调用函数?
- 7. 函数调用,堆栈
- 8. 是否可以调用一个Rust函数从C中获取一个Vec?
- 9. 是否有一个php.ini指令可以在错误上启用堆栈跟踪?
- 10. 在C/C++中了解函数调用的堆栈框架?
- 11. 是否可以删除或插入C#调用堆栈中的帧?
- 12. 是否可以在QWebView中调用JavaScript中的C++函数?
- 13. main函数的C函数没有推动栈中的堆栈
- 14. 是否可以确定堆栈上有多少空间可用?
- 15. 在递归函数中存储堆栈
- 16. 是否可以在delphi 7调试器中查看调用堆栈?
- 17. 是否有添加到C++堆栈底部的函数?
- 18. 我可以告诉一个流氓是否已经死亡,或者它是否因堆栈转储而崩溃?
- 19. 是否可以在另一个函数调用的函数中使用$(this)?
- 20. 构造函数调用的存储位置在哪里?堆栈还是堆?
- 21. 是否可以删除最大调用堆栈大小?
- 22. 是否可以窝在Objective-C的另一个函数中的一个函数
- 23. noexcept函数是否仍然可以调用一个抛出C++ 17的函数?
- 24. Bash是否有用于递归函数调用的私有堆栈框架?
- 25. 是否可以调用嵌套在另一个函数中的函数?
- 26. UWSGI堆栈转储
- 27. 是否可以选择是否生成堆转储?
- 28. 是否可以在Lua中禁用堆栈回溯?
- 29. 是否可以在Netflix OSS堆栈中使用Hazelcast?
- 30. DebugDiag调用堆栈不显示调用堆栈中函数的行数
您是直接寻找调用堆栈的文本输出还是二进制核心转储也适用于您? – 2008-10-03 18:01:49