首页/新闻资讯/正文详情

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

发布时间:2026/9/26 8:20:12 来源:云帆数科 栏目:资讯中心
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),仅供参考

相关推荐

Atlas 框架 bundle 加载过程全解析:从触发时机到代码初始化的三条主线
Atlas 框架 bundle 加载过程全解析:从触发时机到代码初始化的三条主线

移动开发原生移动插件系统 【免费下载链接】atlas A powerful Android Dynamic Component Framework. 项目地址: https://gitcode.com/gh_mirrors/atlas/atlas 点击查看 免费下载 本文基于开源仓库 atlas 源码体系,围绕动态组件框架中"bundle 如何… · 2026/9/26 8:20:06

Atlas 300V 24G部署YOLO全攻略:CANN环境搭建、模型转换与推理调优
Atlas 300V 24G部署YOLO全攻略:CANN环境搭建、模型转换与推理调优

1. Atlas到底是个什么卡:先搞清楚产品线再动手先说个我自己的经历。三年前第一次接触Atlas,是在一个算法团队的服务器机房里。当时团队拿到一批计算卡,包装盒上印着大大的Atlas字样,型号是300V。大家的第一反应都是:这… · 2026/9/26 8:20:06

Claude Code 模板库实战:CLAUDE.md、agents、skills、hooks 构建团队 AI 工作流
Claude Code 模板库实战:CLAUDE.md、agents、skills、hooks 构建团队 AI 工作流

第一次把claude-code-templates这个仓库建出来的时候,团队里还有人问我:这不就是把几个 markdown 文件放在一起吗?当时我没法反驳,因为最开始它确实就是几个 markdown 文件。但跑了三个项目之后,所有人都闭嘴了——新项… · 2026/9/26 8:20:00

Java 线程安全技术笔记:以银行存取款为例
Java 线程安全技术笔记:以银行存取款为例

前言:在我们开发关于程序的时候,并发编程(表面上同时进行,实际上是cpu快速切换线程执行),这就会产生线程安全问题,多线程程序中,多个线程可能同时操作同一份数据。要保证结果正确&am… · 2026/9/26 10:09:03

10G SFP+光模块选型避坑指南:链路预算与兼容性实战解析
10G SFP+光模块选型避坑指南:链路预算与兼容性实战解析

1. 为什么10G SFP光模块选型不是“插上就能用”的简单事 你手头刚上了一台新采购的万兆交换机,配套的SFP光模块随手一插——链路灯亮了,ping通了,网管里端口状态显示UP。你松了口气,觉得这事就算搞定了。结果两周后,业… · 2026/9/26 10:09:03

基于springboot的景区景点推荐导览系统的毕业设计与实现
基于springboot的景区景点推荐导览系统的毕业设计与实现

学弟学妹们,大家好👋!作为计算机专业已经毕业多年的学长,回头再看毕业设计这段日子,依旧感慨万千🌟。当年坐在电脑前,一点点调试接口、逐字打磨论文的画面,现在想起来还历历在目。看… · 2026/9/26 10:09:03

WPF MVVM代码骨架:从绑定刷新到异步命令的避坑指南
WPF MVVM代码骨架:从绑定刷新到异步命令的避坑指南

简介:面向C#/WPF开发者的MVVM模式实战项目,以完整可运行的WPF应用演示Model-View-ViewModel三层解耦、数据绑定、命令处理、依赖属性等核心机制,适合希望从理论过渡到实际项目的初中级桌面开发人员。压缩包共141个文件,包含44个cs… · 2026/9/26 10:09:03

数据销毁的最后一公里:GB 46864 实施前的清除合规与证据链
数据销毁的最后一公里:GB 46864 实施前的清除合规与证据链

数据销毁的最后一公里:GB 46864 实施前的清除合规与证据链 标签:#数据安全 #数据治理 #数据销毁 #合规 #数据生命周期 摘要: 国家强制性标准 GB 46864《电子产品信息清除》已发布、2027 年 1 月 1 日实施,数据销毁从"内部规… · 2026/9/26 10:08:57

推荐美塔斯滤袋制造商 资质齐全的生产厂家合作参考
推荐美塔斯滤袋制造商 资质齐全的生产厂家合作参考

推荐资质齐全的美塔斯滤袋制造商 供行业客户合作参考美塔斯滤袋是以芳纶纤维为原料制成,适配高温烟气环境的工业粉尘过滤配件,核心作用是截留工业气流中的粉尘颗粒物,完成烟气净化,为各类产尘生产场景提供稳定的烟气过滤解决方案。… · 2026/9/26 10:08:57

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码