远程捕获perf record数据跨设备运行perf report报bad event header size错误求解
问题根因
perf默认写入常规文件时,会在采样结束后回写文件头中的总数据量、事件校验等元数据字段。而管道/FIFO是仅追加的顺序IO,无法支持随机回写,导致perf生成的文件头不完整,触发bad event header size报错。你之前将FIFO作为输出路径时,perf仍将其识别为常规随机写文件,没有适配流式输出逻辑,所以无论用什么透明传输通道都会报错。
解决方案
使用perf原生管道输出模式
不要在设备端创建FIFO,直接指定perf输出到标准输出,perf会自动适配流式场景,生成无需回写的合法格式。
桌面端直接拉取数据流并保存的命令:ssh <设备地址> 'perf trace -e cpu-clock -g <app> -o -' > perf.data
也可以直接管道传给perf report实时解析:ssh <设备地址> 'perf trace -e cpu-clock -g <app> -o -' | qemu-arm-static -L root root/usr/bin/perf report -i -
其中-o -参数是让perf输出到stdout,-i -是让perf report从stdin读取数据。配置符号解析参数
你已持有带调试信息的根文件系统和内核文件,解析时添加以下参数即可正常匹配符号:--symfs <带调试信息的根文件系统目录路径>:指定用户态程序的符号查找根目录--vmlinux <带调试信息的内核镜像路径>:指定内核符号文件--kallsyms <设备导出的/proc/kallsyms文件路径>:如果没有带调试信息的vmlinux,可替换为该参数
示例完整解析命令:qemu-arm-static -L root root/usr/bin/perf report -i perf.data --symfs ./debug-root --vmlinux ./vmlinux
版本匹配校验
确保设备端的perf版本和qemu中运行的perf版本完全一致,大版本差异也会导致事件头格式不兼容报错。
内容的提问来源于stack exchange,提问作者Jan Hudec
相关产品推荐
相关产品推荐

