如何使用gprof获取Windows DLL的性能分析信息?
gprof无法分析DLL性能数据的核心原因
- gprof原生设计仅支持对静态链接的主可执行文件做性能解析,生成的
gmon.out中仅记录相对于主程序加载基址的采样地址偏移,没有包含进程运行时动态加载的DLL的基址偏移信息。直接将DLL作为分析目标传入gprof时,采样地址和DLL的符号地址空间完全不匹配,无法对应到具体的函数符号,因此不会输出有效数据。 - 带
-pg参数编译的DLL生成的性能采样数据,默认会写入主程序运行时生成的gmon.out中,不会生成独立的、仅属于DLL的性能数据文件。你当前拿到的gmon.out本质是主程序维度的采样结果,本身就没有单独绑定DLL的符号表信息。 - 进程调用
exit触发gmon.out写入时,libc内置的profiling数据写入逻辑仅会采集主可执行文件的符号映射范围,不会遍历进程加载的所有动态库模块,也不会记录各DLL的基址和符号偏移元数据,进一步导致gprof无法从gmon.out中匹配到DLL的函数信息。
对应的解决方法
- 执行gprof命令时,将加载该DLL的主可执行文件作为分析目标,命令格式为
gprof [主程序文件] gmon.out,只要主程序也带-pg参数编译,输出结果中就会包含DLL内部函数的调用计数、计时等性能数据。 - 如果需要单独对DLL做性能分析,可将DLL编译为静态库,链接到带
-pg参数的测试主程序后运行,再用gprof分析主程序对应的gmon.out即可拿到DLL完整的性能数据。 - 若使用MinGW工具链,可在DLL链接阶段额外添加
-shared-libgcc参数配合-pg使用,同时确保主程序也带-pg编译,即可正常采集DLL的性能数据。
内容的提问来源于stack exchange,提问作者Jean-François Fabre
相关产品推荐
相关产品推荐

