2017-05-24 211 views
0

有人可以举例说明如何以编程方式获取Windows上当前运行的C++程序的调用堆栈吗? 来自某些主题(例如print call stack in C or C++)我有一个建议使用DbgHelp。然而,这个库看起来相当庞大,并且打算用于更多的功能而不仅仅是调用堆栈,因此在没有示例的情况下学习库可能需要很长时间。 此外,该库似乎已过时,因为它的最后一个版本6.12的日期为2010年2月1日(截至目前为止,已有7年)。现在有没有什么新的获取C++的调用堆栈?在Windows上获取C++调用堆栈的示例

如果您给出了DbgHelp用法的示例,您是否还可以描述如何安装它,添加到项目中并随附我的程序?

我想在调用堆栈中获得所有函数的未装饰名称,最好使用参数的值。

+1

[Boost.Stacktrace](http://boostorg.github.io/stacktrace/index.html) – genpfault

回答

0

通过弹出ebp来自动遍历调用堆栈的工作量并不是很大,CaptureStackBackTrace(https://msdn.microsoft.com/en-us/library/windows/desktop/bb204633(v=vs.85).aspx)会为您做到这一点,如果您不想自己做。

+0

据我所知,这只会给出地址,而不是符号(函数名称)。 –

+1

根据程序编译的方式,这些符号甚至可能不在可执行文件中。 –

+0

获取符号是您提到的不想使用的调试帮助库的简介。 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679309(v=vs.85).aspx) 这些符号可以位于许多文件中,并取决于您从哪里获得他们从你那里将有一个可变的质量调用堆栈。如果你只是想让他们脱离一个exe文件,你将不得不编写部分PE解析器 - https://msdn.microsoft.com/en-us/library/ms809762.aspx。 pdb具有最丰富的符号来源,但我不会推荐自己解析它们。 –