支持为原生样本记录 PC 偏移
作者: Baraa-Hasheesh创建于 2026年9月14日更新于 2026年9月14日
标签enhancement
描述该功能 当前的异步分析器在分析原生应用程序或具有高原生依赖性的 Java 应用程序时,缺少了一些高级功能,例如: 1. JFR 记录中的方法签名(支持折叠和火焰图记录) 2. 不能提供代码行信息 3. 不能解析嵌入的原生方法 此功能请求主要是为了寻找解决方案 2 和 3 问题 目前,2 和 3 问题可以部分地通过使用 features=pcaddr 来解决,该选项记录了顶层 PC 值 通过将该值传递给一个读取调试信息的后处理程序,我可以找到嵌入的顶层方法以及顶层方法的行号信息 这里我建议允许分析器记录每个原生样本的 PC 值,以扩展这种可能性,包括中间原生样本 ### 用例 允许用户使用后处理程序查找嵌入的原生方法和行号信息,这对于调试内存泄漏和 CPU 加载非常有用 内存泄漏可以让我确切地知道发生泄漏的分配,而不仅仅是知道大致发生的区域 CPU 加载使得更容易知道哪些具体分支/方法正在导致高 CPU 使用率 ### 建议的解决方案 方法#1: 分析器将简单地记录原始 PC 地址,而不是目前对 pcaddr 所做的方法名,用户的任务是处理 features=pcraw 方法#2: 分析器将在捕获的样本中提供更多信息,可以这样做: 1. 始终记录 PC 地址而不是方法名,在 method_id 中,对于 bci: - 8 位用于帧类型 - 16 位用于代码缓存偏移(在代码缓存数组中) - 8 位保留用于内部使用 2. 在储存时延迟解析信息,使用以下建议的格式 methodName@{CodeCacheName}#{pc-offset}(可以通过风格储存标志控制此功能) 注意:在异步分析器中支持这些功能(嵌入的原生方法和行号信息)并不看起来是一个合理的方法,因为这需要实现完整的 DWARF 解析器 ### 致谢 - [ ] 我可能能够实现此功能请求 - [ ] 此功能可能会引发更改
内容来源: async-profiler/async-profiler