You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 2
    
    (将Ubuntu替换为你的实际发行版名称,比如Ubuntu-22.04)
  • 等待升级完成后,重新进入WSL环境,重新编译运行程序,再执行gprof即可获取正常的时间统计数据。

2. 替代工具方案(无法升级WSL2时)

  • 使用perf工具:部分WSL1版本有限支持perf,可尝试执行perf record ./go和perf report获取性能数据。
  • 使用gperftools:安装后通过libprofiler进行用户态性能分析,编译时链接该库即可生成详细的性能报告。

内容的提问来源于stack exchange,提问作者Felipe_SC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:45:35