【发布时间】:2018-02-28 16:34:48
【问题描述】:
我正在开发一个调试器,当某个函数(例如,kernel32.dll!CreateFileW)在被调试进程的上下文中被调用时,它应该存储当前堆栈跟踪。
调试器将一些代码注入到进程中,安装一个钩子。然后钩子使用RtlCaptureStackBackTrace 获取堆栈跟踪并将其保存在某处。
然后调试器使用函数 SymFromAddr 解析每个堆栈跟踪的条目。
它适用于非托管代码。
今天我已经为一个使用 CLR 支持构建的 MFC 应用程序尝试了这种方法。现在它是非托管代码。钩子仍然获得堆栈跟踪,但调试器无法解析某些堆栈条目。我猜这些条目属于 JIT 编译器生成的代码。
我对 CLR 分析器有点熟悉,可以收到类似JITCompilationStarted 的通知。
问题是JIT编译器生成的代码如何解析(即获取源文件名和行号)地址?
我不能只调用DoStackSnapshot,因为被挂钩的函数可以调用很多时间,所以 DoStackSnapshot 会使进程变慢。
我可以使用FunctionEnter2/FunctionLeave,但是当执行进入/离开函数时会调用它们,我无法获取有关确切代码行的信息。
谢谢!
【问题讨论】:
标签: .net debugging profiling clr