用于在运行时记录调用堆栈的库 (Windows/Linux)

Posted

技术标签:

【中文标题】用于在运行时记录调用堆栈的库 (Windows/Linux)【英文标题】:Library for logging Call Stack at runtime (Windows/Linux) 【发布时间】:2011-10-03 06:59:02 【问题描述】:

我需要一种在调试日志中记录函数堆栈跟踪的方法,以帮助我诊断缺陷。问题是我需要使用 C++ 在 Windows 和 Linux 上实现它。

经过一番研究,我发现:

对于 Windows 实现,我可以使用StackWalk64 API 函数和族。 在 Linux 下,我发现 libunwind 听起来不错。 或者,我可以使用 glibc 的backtrace

在开始工作之前,如果这是正确的方法,我想要一些建议,并询问是否有一个已经编写好的多平台库可以提供帮助。我怀疑我不是第一个需要这个的程序员。 :)

【问题讨论】:

+1 提出了一个很好的问题! 【参考方案1】:

Google Breakpad 会为您处理所有这一切,如果您想从现场获取故障转储。

【讨论】:

崩溃转储包含比我需要的更多信息。并且应该进行后处理 - 这是一个很大的不便。我只需要将堆栈跟踪作为字符串或字符串数​​组。 除非您愿意将私有 PDB 与您的应用一起提供,否则您必须进行后处理,并且 minidump 的大小与大型 JPEG 差不多。 运送私有 PDB 不是问题。【参考方案2】:

我写了 2 篇关于这个主题的文章,包括 Google 的 breakpad 以及适用于 windows 和 linux 的非常薄的自写方法:

事后调试 - http://drdobbs.com/tools/185300443

重新审视事后调试 - http://drdobbs.com/architecture-and-design/227900186

【讨论】:

【参考方案3】:

几年前我写过这个:http://drdobbs.com/cpp/191100567

基本上,一些宏会记录抛出异常时堆栈展开的位置。

可以在库 Imebra (http://imebra.com) 中找到该框架的更新版本

【讨论】:

您指的是 FUNCTION_START/FUNCTION_END 宏? 是的。他们捕获并重新抛出并记录异常的通过。

以上是关于用于在运行时记录调用堆栈的库 (Windows/Linux)的主要内容,如果未能解决你的问题,请参考以下文章

调用堆栈和堆栈跟踪有啥区别?

Linux下利用backtrace追踪函数调用堆栈以及定位段错误[转]

工作经验:Java 系统记录调用日志,并且记录错误堆栈

linux下利用backtrace追踪函数调用堆栈以及定位段错误

在运行时打印调用堆栈(XCode)

Linux内核分析——第二周学习笔记