我只是好奇探究器/调试器如何工作,以便他们可以加载PDB并从另一个进程获取堆栈跟踪信息?甚至从转储文件?
更多说明:
我已经实现了一个简单的内存跟踪器,它收集程序的每个内存分配,获取堆栈跟踪地址和函数名称,并发送到另一个可视化这些内容的工具。
但我认为,在我的主程序中解析堆栈跟踪函数名称并不是一个好主意。这可能会引入大量内存占用和运行时开销。哪会弄乱我的计划。
所以我想知道我是否可以在主程序中记录这些堆栈跟踪地址,并在我的调试工具中解析这些函数名称,文件名和行号?
我已阅读windows dbghelp文档,但我并不了解如何才能实现此目的。
我真正想知道的是,我可以在c ++中为我的调试工具实现该功能,它可以将调用堆栈帧地址来自另一个程序,并获取有关该调用堆栈帧的信息。
答案 0 :(得分:0)
首先,他们需要知道模块的加载位置,EnumProcessModules
然后他们可以使用dbghelp中的符号帮助函数来创建进程状态SymLoadModuleEx
的“虚拟”副本检查提供SymLoadModuleEx的库,看看如何解码符号信息。
我真正想知道的是,我可以在c ++中为我的调试工具实现该功能,它可以从另一个程序获取调用堆栈帧地址,并获取有关该调用堆栈帧的信息。
是的,这是完全可能的,从加载的符号文件的结果,您可以解析从原始机器到DLL中的函数的地址。但是,您需要知道DLL在目标进程中的加载位置,才能使其正常工作。
这可能是初始化时目标进程的额外信息,或者使用EnumProcessModules。