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

bpftrace中kstack()未解析内核函数名,如何显示函数名而非地址?

bpftrace kstack仅显示内核地址无法解析函数名的原因及解决方法

原因

  • 缺少内核调试符号包:bpftrace需要内核调试符号(debuginfo)将内存地址映射为函数名,主流发行版默认不会预装这类包,因为它们会占用大量磁盘空间。
  • 内核配置缺失(少见):部分自定义内核可能未开启CONFIG_KALLSYMS或CONFIG_DEBUG_INFO选项,这两个配置是内核提供符号解析能力的基础,不过大多数发行版默认已开启。

解决步骤(Ubuntu环境)

1. 安装内核调试符号包

首先确认当前运行的内核版本:

uname -r

配置Ubuntu调试符号仓库

Ubuntu的调试符号包存储在独立仓库中,需要先添加仓库并导入验证密钥:

# 添加调试源
echo "deb [signed-by=/usr/share/keyrings/ubuntu-ddebs.gpg] http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/ddebs.list

# 导入仓库验证密钥
curl -s https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x40976EAF437D05B5 | sudo gpg --dearmor -o /usr/share/keyrings/ubuntu-ddebs.gpg

安装对应内核的调试符号

更新包列表并安装调试符号包:

sudo apt update
sudo apt install linux-image-$(uname -r)-dbgsym

2. 补充内核工具依赖

确保安装bpftrace所需的内核工具包:

sudo apt install linux-tools-common linux-tools-$(uname -r)

3. 验证修复效果

重新运行你的bpftrace命令:

bpftrace -e 'k:vfs_read{@[kstack] = count()}'

此时kstack输出应显示解析后的内核函数名而非原始地址。如果仍有问题,可通过addr2line手动验证符号是否生效:

addr2line -e /usr/lib/debug/boot/vmlinux-$(uname -r) 0xffffffffa78d2dc1

若该命令返回具体函数名,说明调试符号已正确安装,bpftrace即可正常解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:25:30