Kcachegrind 和 perf

Kcachegrind

安装命令

sudo apt update
sudo apt install kcachegrind

配合使用的工具

KCachegrind 通常和 Callgrind(Valgrind 的子工具)一起使用

sudo apt install valgrind

采样命令:

valgrind --tool=callgrind ./your_program

打开 kCachegrind:

kcachegrind callgrind.out.12345

从 perf 转换到 KCachegrind 格式

如果使用 perf 而不是 valgrind, 可以用:

perd record -g ./your_program
perf script | c++filt | gprof2dot -f perf | dot -Tpng -o out.png

或者:

perf script | c++filt | perf2calltree

perf2calltree 是一个将 perf 输出转换为 callgrind 格式的脚本。
安装方式:

sudo apt install linux-tools-common linux-tools-generic

或手动安装脚本:

pip install perf2calltree

然后再:

perf script | perf2calltree

这会生成 callgrind.out.perf 文件,可直接在 kcachegrind 打开。

Hotspot

安装命令

sudo add-apt-repository universe
sudo apt update
sudo apt install hotspot

使用方法

  1. 用 perf 采集性能数据:

    perf record -g ./your_program
    

    会生成一个 perf.data 文件

  2. 打开 Hotspot:

    hotspot perf.data
    
  3. 查看不同视图:

    • Summary:各线程 CPU 使用率
    • Bottom-Up / Top-Down:函数热点
    • Flame Graph:火焰图
    • Caller / Callee:调用关系
    • Timeline:多线程时间轴

实用提示

  • Hotspot 需要 perf 工具:

    # 和当前内核版本适配的
    sudo apt update
    sudo apt install linux-tools-$(uname -r) linux-cloud-tools-$(uname -r)
    
    # 手动构建
    sudo apt update
    sudo apt install -y \
        build-essential \
        flex bison \
        libelf-dev \
        libdw-dev 
        clang \
        libdebuginfod-dev \
        systemtap-sdt-dev \
        libslang2-dev \
        llvm-dev \
        libbabeltrace-ctf-dev \
        libcapstone-dev \
        libpfm4-dev \
        libtraceevent-dev \
        libelf-dev \
        make \
        gcc \
        flex \
        bison \
        libncurses5-dev \
        python3
    
    git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
    cd linux/tools/perf
    make -j$(nproc)
    sudo cp perf /usr/local/bin/
    perf --version
    
  • 如果上述安装完成后没有 perf 工具,可以使用下面命令安装通用版本

    sudo apt install linux-tools-common linux-tools-generic
    sudo find /usr/lib -type f -name perf
    sudo ln -sf /usr/lib/linux-tools-*/perf /usr/bin/perf
    perf --version
    
  • Ubuntu / Kubuntu 24.04 默认把 perf_event_paranoid 设置得很严格(=4), 只有 root 或拥有 CAP_PERFMON 等特权的用户才能使用。

    sudo vim /etc/sysctl.conf
    # 在文件末尾添加:
    kernel.perf_event_paranoid = 0
    # 保存后执行:
    sudo sysctl -p
    

    ⚙️ 参数级别解释

    含义
    -1 允许所有事件(包括 raw 与内核事件)
    0 允许普通用户采样 CPU 事件(推荐)
    1 仅允许用户空间事件
    2 禁止内核 profiling
    3~4 完全禁止非 root 用户使用 perf(Ubuntu 默认)
  • 给自己的程序加上调试符号

    编译时带上:

    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
    # 或者直接
    g++ -O2 -g main.cpp -o main
    
  • 安装系统库的调试符号包

    sudo apt install libc6-dbg libstdc++6-dbg
    sudo apt install linux-image-$(uname -r)-dbgsym
    # 如果上述指令找不到 libstdc++6-dbg 可以使用 libstdc++6-dbgsym 代替;Ubuntu 24.04(以及后续版本)默认不再提供 libstdc++6-dbg 这个旧包名。
    release=$(lsb_release -cs)
    
    sudo tee /etc/apt/sources.list.d/ddebs.list <<EOF
    deb http://ddebs.ubuntu.com ${release} main restricted universe multiverse
    deb http://ddebs.ubuntu.com ${release}-updates main restricted universe multiverse
    deb http://ddebs.ubuntu.com ${release}-security main restricted universe multiverse
    EOF
    
    sudo apt install ubuntu-dbgsym-keyring
    sudo apt update
    sudo apt install libc6-dbg libstdc++6-dbgsym
    sudo apt install linux-image-$(uname -r)-dbgsym
    
    sudo apt install apt-src
    sudo apt-src --build install libglib2.0-0
    
    sudo apt install -y \
      libc6-dbg \
      libstdc++6-dbgsym \
      libgcc-s1-dbgsym \
      libpthread-stubs0-dev \
      libx11-6-dbgsym
     
    sudo apt install apt-src
    sudo apt-src --build install libglib2.0-0
    
    
    
  • 如果程序涉及 ROS 或其他第三方包,可以尝试:

    sudo apt install ros-jaxxy-<package>-dbgsym
    
  • 确保 perf 能找到符号文件

    perf report --symfs=/
    # 或者显式指定符号搜索路径:
    perf report --symfs /usr/lib/debug
    # 也可以查看某个符号路径:
    perf buildid-list
    
  • 如果想在火焰图中完全还原 C++ 名字(防止符号被 C++ mangling 混淆):

    perf script | c++filt | ./flamegraph.pl > flame.svg
    

使用 perf

  1. 设置环境变量(插件符号路径)

    export PERF_BUILDID_DIR=$(pwd)/install/localization/lib/plugins
    
    • 让 perf 能解析插件库 DWARF 符号
  2. CMakeList.txt 中增加变量

    set(CMAKE_BUILD_TYPE RelWithDebInfo)  # 或 Debug
    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -fno-omit-frame-pointer")
    set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -fno-omit-frame-pointer")
    
  3. perf record 命令

    perf record -F 99 -g --call-graph dwarf,2048 -e cpu-clock -- ./install/localization/lib/localization/localization_app  /home/gavin/X2Robot/gitlab/turing/install/localization/share/localization/conf/simple_slam.yaml
    
posted @ 2025-11-10 15:26  BlueSpace  阅读(3)  评论(0)    收藏  举报