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
相关产品推荐
相关产品推荐

