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
使用方法
-
用 perf 采集性能数据:
perf record -g ./your_program会生成一个 perf.data 文件
-
打开 Hotspot:
hotspot perf.data -
查看不同视图:
- 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 \python3git 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 EOFsudo apt install ubuntu-dbgsym-keyring sudo apt update sudo apt install libc6-dbg libstdc++6-dbgsym sudo apt install linux-image-$(uname -r)-dbgsymsudo apt install apt-src sudo apt-src --build install libglib2.0-0sudo apt install -y \libc6-dbg \libstdc++6-dbgsym \libgcc-s1-dbgsym \libpthread-stubs0-dev \libx11-6-dbgsymsudo 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
-
设置环境变量(插件符号路径)
export PERF_BUILDID_DIR=$(pwd)/install/localization/lib/plugins- 让 perf 能解析插件库 DWARF 符号
-
perf record 命令
sudo 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