如何从另一个进程的callstack地址中检索函数名称

时间:2017-09-08 06:13:03

标签: c++ windows debugging

我只是好奇探究器/调试器如何工作,以便他们可以加载PDB并从另一个进程获取堆栈跟踪信息?甚至从转储文件?

更多说明:

我已经实现了一个简单的内存跟踪器,它收集程序的每个内存分配,获取堆栈跟踪地址和函数名称,并发送到另一个可视化这些内容的工具。

但我认为,在我的主程序中解析堆栈跟踪函数名称并不是一个好主意。这可能会引入大量内存占用和运行时开销。哪会弄乱我的计划。

所以我想知道我是否可以在主程序中记录这些堆栈跟踪地址,并在我的调试工具中解析这些函数名称,文件名和行号?

我已阅读windows dbghelp文档,但我并不了解如何才能实现此目的。

我真正想知道的是,我可以在c ++中为我的调试工具实现该功能,它可以将调用堆栈帧地址来自另一个程序,并获取有关该调用堆栈帧的信息。

1 个答案:

答案 0 :(得分:0)

首先,他们需要知道模块的加载位置,EnumProcessModules

然后他们可以使用dbghelp中的符号帮助函数来创建进程状态SymLoadModuleEx

的“虚拟”副本

检查提供SymLoadModuleEx的库,看看如何解码符号信息。

  

我真正想知道的是,我可以在c ++中为我的调试工具实现该功能,它可以从另一个程序获取调用堆栈帧地址,并获取有关该调用堆栈帧的信息。

是的,这是完全可能的,从加载的符号文件的结果,您可以解析从原始机器到DLL中的函数的地址。但是,您需要知道DLL在目标进程中的加载位置,才能使其正常工作。

这可能是初始化时目标进程的额外信息,或者使用EnumProcessModules。