用于在运行时记录调用堆栈的库 (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追踪函数调用堆栈以及定位段错误[转]