资讯详情

Skia 消毒器构建与测试:MSAN、ASAN、TSAN 配置实战指南

📅 2026/9/26 8:20:22 | 华诺云谱 👁 阅读
Skia 消毒器构建与测试:MSAN、ASAN、TSAN 配置实战指南
图形学图像处理【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images.项目地址https://gitcode.com/gh_mirrors/skia1/skia点击查看免费下载本文以 Skia 官方测试文档 site/docs/dev/testing/xsan.md 为核心脉络完整讲解如何使用最新版 Clang 为 Skia 构建 MSAN内存消毒器、ASAN地址消毒器与 TSAN线程消毒器构建并结合仓库源码GN 构建配置、CI 任务定义、工具链脚本说明其底层实现原理。读完本文你将掌握三种 sanitizer 构建的完整配置步骤、sanitizeGN 参数的展开规则、运行期环境变量调优以及 Skia CI 中针对 sanitizer 的已知限制与测试裁剪策略。消毒器总览Skia 支持哪些运行时检查Skia 使用 Clang 提供的运行时消毒器sanitizer来发现普通构建难以察觉的内存错误与数据竞争。官方文档明确指出用最新版 Clang 即可完成 ASAN、UBSAN、TSAN 的编译各消毒器的平台支持情况如下消毒器检测重点支持平台UBSAN未定义行为越界、除零、对齐问题等Linux、Mac、Android、Windows部分检查与平台相关ASAN堆/栈/全局缓冲区越界、悬垂指针、内存泄漏等Linux、Mac、Android、WindowsTSAN多线程数据竞争、happens-before 关系违例Linux、MacMSAN未初始化内存读取Linux需配合 MSAN 插桩的 libc从仓库中的 CI 任务定义 infra/bots/jobs.json 可以看到Skia 持续集成中实际运行着Build-Debian10-Clang-x86_64-Debug-SwiftShader_MSAN、Build-Debian10-Clang-x86_64-Release-MSAN、Test-Debian10-Clang-GCE-CPU-AVX2-x86_64-Release-All-MSAN等 sanitizer 任务说明这些配置是经过生产环境验证的官方流程。此外Android 平台还额外支持 HWASAN硬件辅助地址消毒器由 infra/bots/recipe_modules/build/android.py 中的sanitize HWASAN注入。为什么 sanitizer 构建要用 libc官方文档特别强调用 libc 测试 sanitizer 构建比用系统自带的 libstdc 能发现更多问题。原因是 libc 会主动挂钩hook到 sanitizer 的检测逻辑中帮助分析更彻底。Skia 的 Linux 工具链中随附了一份 libc位于工具链目录的/lib下。这一点在 CI 代码中得到了印证运行测试的环境准备逻辑 infra/bots/recipe_modules/flavor/default.py 中有同样的注释说明并且所有 sanitizer 任务都会把clang_linux/lib/x86_64-unknown-linux-gnu即工具链内置 libc 所在目录追加到LD_LIBRARY_PATH。而 GN 构建层在 Linux 上强制使用 libc 编译与链接# gn/skia/BUILD.gn#L379-L382 if (is_linux) { cflags_cc [ -stdliblibc ] ldflags [ -stdliblibc ] }因此使用 Linux 工具链构建 sanitizer 版本时链接目标默认就是随附的 libc而非系统 libstdc。准备工作获取 Clang 与 MSAN 插桩的 libc要编译和运行 MSAN 构建必须准备一份MSAN 插桩instrumented版本的 libc。官方文档给出了两条路径任选其一即可得到位于CLANGDIR下的 Clang 工具链普通bin/目录存放 clang/clang 与符号化工具/msan目录存放 MSAN 插桩版 libc/tsan目录存放 TSAN 插桩版 libc。方式一直接下载预编译 Clang仅限 Googler该方式依赖gsutilGoogle Cloud SDK 组件适用于有内部下载权限的 Google 员工gcloud auth application-default login CLANGDIR${HOME}/clang ./bin/sk asset download clang_linux $CLANGDIR其中sk是 Skia 的资产asset管理工具仓库中另有 bin/fetch-sk 可获取clang_linux是仓库定义的 Linux Clang 工具链资产。方式二从源码自建 Clang 与插桩 libc其他用户没有内部权限的用户可以完全从源码构建。官方文档给出的步骤如下CLANGDIR${HOME}/clang python3 tools/git-sync-deps CC CXX infra/bots/assets/clang_linux/create.py -t $CLANGDIR先运行 tools/git-sync-deps 同步依赖再以空CC/CXX环境变量强制使用系统编译器执行 infra/bots/assets/clang_linux/create.py 生成工具链。这个脚本的实际构建逻辑记录在 infra/bots/assets/clang_linux/Dockerfile 中其关键环节包括用 CMake 引导编译bootstrapclang、lld、clang-tools-extra 等组件用新编译出的 clang 从runtimes子目录构建 libc/libcabiTSAN 版LLVM_USE_SANITIZERThread产物拷贝到工具链的/tsanMSAN 版LLVM_USE_SANITIZERMemoryWithOrigins产物拷贝到工具链的/msan将llvm-symbolizer、llvm-profdata、llvm-cov放入bin/供 sanitizer 报告符号化使用。Dockerfile 注释还提醒引导 libc 时必须从runtimes子目录开始构建而不是llvm子目录这与 LLVM 官方的 bootstrapping 文档一致。配置与编译 MSAN 构建MSAN 用于检测读取未初始化内存这类问题是三类消毒器中配置要求最高的它要求整个依赖链包括 C 标准库都经过 MSAN 插桩。官方文档给出的完整配置如下CLANGDIR${HOME}/clang mkdir -p out/msan cat out/msan/args.gn - EOF cc ${CLANGDIR}/bin/clang cxx ${CLANGDIR}/bin/clang extra_cflags [ -B${CLANGDIR}/bin ] extra_ldflags [ -B${CLANGDIR}/bin, -fuse-ldlld, -L${CLANGDIR}/msan, -Wl,-rpath,${CLANGDIR}/msan ] sanitize MSAN skia_use_fontconfig false EOF python3 tools/git-sync-deps bin/gn gen out/msan ninja -C out/msan各参数作用说明cc/cxx指定工具链的 clang 与 clangextra_cflags中的-B${CLANGDIR}/bin把工具链 bin 目录加入编译器的搜索路径确保使用配套的汇编器/链接器等子工具extra_ldflags中的-fuse-ldlld使用 LLVM 的 lld 链接器-L${CLANGDIR}/msan与-Wl,-rpath,${CLANGDIR}/msan链接并运行期定位 MSAN 插桩版 libc即文档脚注 [1] 所说的/msan目录sanitize MSANGN 构建参数告诉构建系统启用内存消毒器其底层展开规则见下文sanitize 参数的展开一节skia_use_fontconfig false关闭 fontconfig因为它在 MSAN 下会产生大量误报——CI 构建脚本 infra/bots/recipe_modules/build/default.py 对 MSAN 任务也是强制设置这一项。GN 构建层还会为 MSAN 自动追加-fsanitize-memory-track-origins见 gn/skia/BUILD.gn用于在报告中追踪未初始化值的来源origin这对定位问题至关重要。此外从dm_flags.go的注释看MSAN 任务默认不启用--randomProcessorTest随机种子测试infra/bots/gen_tasks_logic/dm_flags.go并会跳过Once、Shared两类测试dm_flags.go这些都是在 CI 中经过实践沉淀的规避策略。配置与编译 ASAN 构建ASAN 主要检测缓冲区越界、use-after-free 等地址类内存错误。官方配置CLANGDIR${HOME}/clang mkdir -p out/asan cat out/asan/args.gn - EOF cc ${CLANGDIR}/bin/clang cxx ${CLANGDIR}/bin/clang sanitize ASAN extra_ldflags [ -fuse-ldlld, -Wl,-rpath,${CLANGDIR}/lib/x86_64-unknown-linux-gnu ] EOF python3 tools/git-sync-deps bin/gn gen out/asan ninja -C out/asan与 MSAN 不同ASAN 不需要插桩版的 libc因此只需把-Wl,-rpath指向工具链随附的普通 libc 所在目录lib/x86_64-unknown-linux-gnu。注意ASAN 实际会隐式联动 UBSAN在 gn/skia/BUILD.gn 中sanitize ASAN会被展开为undefined,address,float-divide-by-zero即同时开启未定义行为与浮点除零检测仅当目标为 Android 时才退回纯address原因是 UBSAN 存在链接错误见代码中的 skia:13344 备注。CI 构建脚本 default.py 还显示ASAN 任务会关闭 SPIR-V 校验skia_enable_spirv_validation false以规避消毒器与校验层之间的冲突。配置与编译 TSAN 构建TSAN 用于检测多线程数据竞争。官方配置CLANGDIR${HOME}/clang mkdir -p out/tsan cat out/tsan/args.gn - EOF cc ${CLANGDIR}/bin/clang cxx ${CLANGDIR}/bin/clang sanitize TSAN is_debug false extra_ldflags [ -Wl,-rpath,${CLANGDIR}/lib ] EOF python3 tools/git-sync-deps bin/gn gen out/tsan ninja -C out/tsan这里把is_debug设为false即 Release 构建rpath 指向工具链/lib目录。与 MSAN 类似CI 中 TSAN 也使用独立的插桩版 libc测试环境会把clang_linux/tsan追加到LD_LIBRARY_PATHflavor/default.py。sanitize 参数在 GN 构建系统中的展开sanitize是 Skia GN 构建的顶层参数默认空字符串定义于 gn/BUILDCONFIG.gn核心展开逻辑集中在 gn/skia/BUILD.gn。理解这段代码就能明白上面三个配置背后到底发生了什么sanitize取值实际传给编译器的-fsanitize值备注MSANmemory附加-fsanitize-memory-track-originsASANundefined,address,float-divide-by-zeroAndroid 上退化为addressskia:13344TSANthread—HWASANhwaddress用于 Android 硬件辅助地址消毒其他任意值原样透传如address,undefined支持直接传入逗号分隔的列表其他关键规则仅默认工具链生效sanitize只作用于默认 toolchain交叉编译等场景下会被清空BUILD.gn禁用恢复模式统一追加-fno-sanitize-recover$sanitizers即一旦检测到问题立即终止程序并报错而不是继续运行BUILD.gn抑制列表通过-fsanitize-blacklist挂载 tools/xsan.supp 抑制文件其中豁免了 libpng 的filter_sse2_intrinsics.c与 zlib 的deflate.c两者会解引用未对齐指针注意该文件修改后需要gn clean全量重编才能生效文件头部注释明确说明帧指针非 Windows 平台追加-fno-omit-frame-pointer保证栈回溯信息完整BUILD.gnWindows/MSVC 特例非 Clang 编译器下 ASAN 使用 MSVC 的/fsanitizeaddress并链接clang_rt.asan-x86_64.libBUILD.gn指针溢出可恢复ASAN 构建下指针溢出检测被设为可恢复模式-fsanitize-recoverpointer-overflow见recover_pointer_overflow配置BUILD.gn对应 skia:9731RTTI 依赖由于-fsanitizevptr需要 RTTI除 ASAN 外的构建默认不开启该检查BUILD.gn。运行测试sanitizer 运行期环境与日志解读构建完成后即可运行 Skia 测试二进制如dm、nanobench。CI 测试环境配置infra/bots/recipe_modules/flavor/default.py为我们总结了经过验证的运行期最佳实践动态库路径LinuxMSAN 构建LD_LIBRARY_PATH需包含clang_linux/msanMSAN 插桩 libcTSAN 构建LD_LIBRARY_PATH需包含clang_linux/tsanTSAN 插桩 libc所有 sanitizer 构建还需包含clang_linux/lib/x86_64-unknown-linux-gnu普通 libc并把clang_linux/bin加入PATH以便 sanitizer 报告调用llvm-symbolizer完成符号化。环境变量调优ASANASAN_OPTIONSsymbolize1 detect_leaks1Mac/Windows 不支持detect_leaks仅保留symbolize1LSAN_OPTIONSsymbolize1 print_suppressions1UBSAN_OPTIONSsymbolize1 print_stacktrace1TSANTSAN_OPTIONSreport_signal_unsafe0不报告信号处理器中的 malloc/fprintf 等调用因为此时程序本就在崩溃边缘若报告中栈帧显示unknown module可尝试为dm尤其是 Vulkan 后端追加fast_unwind_on_malloc0代价是 225 倍速度下降仅在确实需要时启用。CI 还会对 Linux 上的dm、nanobench使用 symbolize_stack_trace.py 包装运行自动对 sanitizer 输出做二次符号化便于阅读flavor/default.py。另外ASAN/TSAN 任务会关闭 Vulkan SDK 的 debug 层ASAN 会在其中报告泄漏、TSAN 会内存不足见 flavor/default.py。CI 中的 sanitizer已知限制与测试裁剪把 sanitizer 构建接入日常测试并非开箱即用Skia CI 沉淀了大量规避经验可作为本地实践的参考结果不上传ASAN、MSAN、TSAN 均列入no_upload列表infra/bots/cfg.json即这类任务的 GM/性能数据不上传 Golden/Perf 服务器因为 sanitizer 构建本身用于找 bug 而非做基准对比TSAN 裁剪移除svg测试源skbug.com/10848dm_flags.go在特定的TSAN_Vulkan任务上整体跳过测试以避免 OOM 与大量误报注释中提到 NUC11TZi5 等 GPU 组合TSANVulkan 场景下强制同时开启 GLdefault.py作为 NVIDIA 驱动超时的工作区MSAN 裁剪跳过Once/Shared测试、不启用--randomProcessorTest并关闭 fontconfigASAN 裁剪关闭 SPIR-V 校验、关闭 Vulkan debug 层超时放宽MSAN 任务的超时时间被放宽到 9 小时gen_tasks_logic.go说明插桩构建测试的耗时远高于普通构建。常见问题与排错提示结合文档与源码总结几个高频问题MSAN 报错使用未初始化值但无法定位来源确认args.gn中sanitize MSAN正确设置——构建系统会自动追加-fsanitize-memory-track-origins若自行覆盖了 cflags 请保留该选项运行时找不到 libc 动态库MSAN/TSAN 构建需确保-Wl,-rpath与运行期LD_LIBRARY_PATH都指向工具链的msan/tsan目录修改了 tools/xsan.supp 但无效该抑制文件只在 GN 构建的干净重建后生效请先执行gn clean文件头部注释 tools/xsan.supp 明确要求栈回溯显示unknown module按上文建议设置fast_unwind_on_malloc0误报集中在字体/图像解码库优先确认skia_use_fontconfig false是否已设置MSAN 必配并检查相关第三方库是否命中 xsan.supp 的豁免列表。延伸阅读官方测试文档原文site/docs/dev/testing/xsan.mdsanitize 参数展开与编译器标志gn/skia/BUILD.gnsanitizer 抑制列表tools/xsan.suppLinux Clang 工具链含 MSAN/TSAN libc构建脚本infra/bots/assets/clang_linux/DockerfileCI 构建参数sanitize 注入、SwiftShader 插桩infra/bots/recipe_modules/build/default.py测试运行期环境变量与符号化infra/bots/recipe_modules/flavor/default.pysanitizer 任务的测试裁剪策略infra/bots/gen_tasks_logic/dm_flags.goAndroid ASAN/HWASAN 注入infra/bots/recipe_modules/build/android.py赞分享图形学图像处理【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images.项目地址https://gitcode.com/gh_mirrors/skia1/skia点击查看免费下载相关推荐Skia 构建与测试中的 MSAN、ASAN、TSAN 与 UBSAN 消毒器实战指南Skia 构建与测试中的 MSAN、ASAN、TSAN 与 UBSAN 消毒器实战指南 本指南基于 Skia 官方开发文档 xsan.md https://li图形学rippledxrpldSanitizer 配置与实战指南ASAN/TSan/UBSan 构建、测试与抑制规则rippledxrpldSanitizer 配置与实战指南ASAN/TSan/UBSan 构建、测试与抑制规则 本指南基于 rippledxrpld仓区块链Julia 源码构建中的 Sanitizer 支持ASAN / MSAN / TSAN 检测环境搭建全指南Julia 源码构建中的 Sanitizer 支持ASAN / MSAN / TSAN 检测环境搭建全指南 导读 本指南面向需要在 Julia 自身 C/C编程语言编译器语言运行时标准库JIT编译上一篇百度网盘直链解析终极指南告别蜗牛速度的完整解决方案下一篇突破速度壁垒重新定义百度网盘下载体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑