WSL1 Ubuntu中gprof分析C程序仅显示调用数,时间占比全为0.00
WSL1下gprof时间数据全为0的问题解决
问题现象
在WSL1的Ubuntu环境中,使用gcc -pg编译C程序后,运行gprof ./go -p -b仅能看到函数调用次数,所有时间占比、耗时数据均为0.00。但通过time ./go可知程序实际用户态耗时0.547s,排除程序运行过快导致无数据的可能。
涉及代码如下:
主程序go.c
#include <stdio.h> #include "functions.h" #define maxloop 1e7 int main(int argc, char*argv[]) { int i; double x; double xsum = 0.0; for (i = 1; i < maxloop; i++) { x = myFun1(i) + myFun2(i) + myFun3(i); xsum += x; } printf("xsum = %.6f\n", xsum); return 0; }
函数文件functions.c
#include <math.h> double myFun1(double x) { double a = sin(x); return a; } double myFun2(double x){ double a = pow(x,3); return a; } double myFun3(double x){ double a = sqrt(x); return a; }
头文件functions.h
double myFun1(double x); double myFun2(double x); double myFun3(double x);
编译及gprof命令:
gcc -pg -o go go.c functions.c -lm ./go gprof ./go -p -b
问题原因
WSL1采用Windows内核模拟Linux系统调用的实现方式,不具备真正Linux内核的性能采样能力。gprof的-pg选项依赖内核定期采样程序调用栈来统计时间消耗,WSL1无法完成这一内核级操作,因此只能统计用户态可追踪的函数调用次数,无法生成时间相关数据。
解决办法
1. 升级到WSL2(推荐)
WSL2使用完整的Linux内核,完全支持gprof的采样机制,步骤如下:
- 打开Windows PowerShell,执行命令将目标发行版切换为WSL2:
(将wsl --set-version Ubuntu 2Ubuntu替换为你的实际发行版名称,比如Ubuntu-22.04) - 等待升级完成后,重新进入WSL环境,重新编译运行程序,再执行gprof即可获取正常的时间统计数据。
2. 替代工具方案(无法升级WSL2时)
- 使用
perf工具:部分WSL1版本有限支持perf,可尝试执行perf record ./go和perf report获取性能数据。 - 使用
gperftools:安装后通过libprofiler进行用户态性能分析,编译时链接该库即可生成详细的性能报告。
内容的提问来源于stack exchange,提问作者Felipe_SC
相关产品推荐
相关产品推荐

