Clang Coverage生成空default.profraw文件问题排查求助
问题描述
我正在对某库进行模糊测试(fuzz testing),使用Clang coverage获取代码覆盖率。编译smp-fuzzer-cov时已添加-fprofile-instr-generate -fcoverage-mapping编译选项,执行的命令如下:
m smp-fuzzer-cov LLVM_PROFILE_FILE="/scratch/smp-fuzzer-out/default.profraw" $AOSP/out/host/linux-x86/bin/smp-fuzzer-cov /scratch/smp-fuzzer-out/inputs/*
但生成的default.profraw文件始终为空。多次尝试让模糊测试运行1小时后手动用Ctrl+C终止,文件仍为空。请问是手动终止导致的,还是存在其他原因?
排查分析
1. 手动终止(Ctrl+C)的影响
Ctrl+C发送SIGINT信号,Clang的profile生成机制默认在进程正常退出时才会把缓存的profile数据写入文件。如果进程被SIGINT终止,可能会导致数据未写入,但你运行了1小时,正常来说至少会有部分缓存数据落地,所以大概率不是单纯手动终止的问题。
2. 其他核心排查点
编译选项未生效:
验证smp-fuzzer-cov是否真的包含覆盖率编译选项,执行:nm $AOSP/out/host/linux-x86/bin/smp-fuzzer-cov | grep "__llvm_profile"无输出则说明编译选项没加上,需要检查编译脚本/Makefile是否正确传递了
-fprofile-instr-generate -fcoverage-mapping参数。路径权限不足:
检查/scratch/smp-fuzzer-out/目录是否有写入权限,执行:touch /scratch/smp-fuzzer-out/test_perm.txt若失败,需调整目录权限或更换输出路径。
Fuzzer未执行目标代码:
确认传入的inputs/*是有效用例,fuzzer是否真的触发了目标库的代码逻辑。可通过添加调试日志或用strace跟踪系统调用,验证是否有调用目标库函数。环境变量未正确传递:
检查LLVM_PROFILE_FILE是否被fuzzer进程继承,修改命令为:LLVM_PROFILE_FILE="/scratch/smp-fuzzer-out/default.profraw" env | grep LLVM_PROFILE_FILE && $AOSP/out/host/linux-x86/bin/smp-fuzzer-cov /scratch/smp-fuzzer-out/inputs/*若输出为空,改用
export提前设置环境变量:export LLVM_PROFILE_FILE="/scratch/smp-fuzzer-out/default.profraw" $AOSP/out/host/linux-x86/bin/smp-fuzzer-cov /scratch/smp-fuzzer-out/inputs/*版本不兼容:
确保编译fuzzer的Clang版本与系统中llvm-profdata的版本一致,版本不匹配可能导致profile数据无法正常生成。
3. 快速验证方法
设置fuzzer自动退出条件(比如限制运行时长、处理完所有输入后退出),观察正常退出后是否生成非空的profraw文件。如果仍为空,可彻底排除手动终止的问题,专注其他排查点。
内容的提问来源于stack exchange,提问作者oxyuranus

