新闻详情

新闻详情

首页 / 资讯中心 / 详情

Flutter Engine 的 Sanitizer 使用指南:用 TSan/ASan/MSan/UBSan/LSan 定位引擎内存与并发缺陷

发布时间:2026/9/28 8:44:28来源:尧图网络
Flutter Engine 的 Sanitizer 使用指南:用 TSan/ASan/MSan/UBSan/LSan 定位引擎内存与并发缺陷
跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载Flutter Engine 的构建系统从根上接入了 Clang 生态的五大 SanitizerThread/Address/Memory/Undefined Behavior/Leak用于在开发与调试阶段定点隔离引擎内部的并发数据竞争、内存错误、未初始化内存读取等构造性问题。本文将基于 docs/Using-Sanitizers-with-the-Flutter-Engine.md 的完整流程结合仓库中的 tools/gn、testing/sanitizer_suppressions.sh 及各 suppressions 文件为你梳理从配置构建、运行单元测试到维护抑制规则的一整套可落地操作。读完本文你将能针对具体故障反向选择合适的 Sanitizer在本地完成一次带抑制规则suppression的引擎测试构建并学会如何安全地新增、裁剪抑制条目。一、五大 Sanitizer 概览与选型思路Flutter Engine 的所有构建变体都支持开启以下 Sanitizer 的任意组合每种工具针对一类特定的“构造性问题”construction issuesSanitizer检测目标典型问题示例GN 开关Thread SanitizerTSan数据竞争data races多线程同时读写同一共享变量且无同步--tsanAddress SanitizerASan内存错误use-after-free、缓冲区溢出--asanMemory SanitizerMSan读取未初始化内存读取未赋值的堆/栈内存--msanUndefined Behavior SanitizerUBSan未定义行为有符号溢出、空指针解引用、对齐错误--ubsanLeak SanitizerLSan内存泄漏堆对象未释放--lsan这些开关在 tools/gn 中会被翻译为对应的 GN 参数is_msan、is_asan、is_tsan、is_lsan、is_ubsan随后作用于整个构建根buildroot。选型建议原文档核心方法论不是所有“目标架构 × 宿主平台 × Sanitizer”的组合都受支持且每种 Sanitizer 在不同工具链版本上的支持度差异很大。同时受构建/测试基础设施限制这些 Sanitizer默认不会在 presubmit 或 build-bot 上开启。因此官方推荐的做法是从问题反推工具work backwards from a problem遇到疑似数据竞争就用 TSan遇到崩溃伴随内存访问错误就用 ASan遇到未初始化读取就用 MSan先用最有希望定位该问题的那一个。从仓库的实际 suppressions 文件可以看出这套方法论的应用痕迹例如 tsan_suppressions.txt 中抑制了flutter::Shell::OnAnimatorBeginFrame在引擎关闭时的竞争lsan_suppressions.txt 中抑制了MakeSkSurfaceFromBackingStore在引擎关闭时未回收的 SkSurface——这些正是引擎生命周期边界上的已知问题。二、通用使用准则一次配置全量生效开启 Sanitizer 的构建变体通常会在构建阶段直接失败或在运行特定单元测试目标时失败。这些失败要么是未被正确标注的误报false positive要么是 Flutter Engine 或 Dart VM 的真实缺陷。官方策略是允许在不修复全部问题的情况下继续发现新问题——通过选择性抑制suppression已知问题把噪音排除在外。2.1 一键加载全部 Sanitizer 选项所有抑制规则与 Sanitizer 运行选项都通过环境变量注入可在当前 shell 中一次性加载source ./flutter/testing/sanitizer_suppressions.sh执行后脚本会打印各 Sanitizer 使用的抑制文件路径示例输出Using Thread Sanitizer suppressions in ./flutter/testing/tsan_suppressions.txt Using Leak Sanitizer suppressions in ./flutter/testing/lsan_suppressions.txt查看仓库中 testing/sanitizer_suppressions.sh 的源码可以看到它实际完成的工作根据宿主系统Linux/Darwin定位 buildtools 目录为TSAN_OPTIONS、LSAN_OPTIONS、UBSAN_OPTIONS分别设置suppressions指向 tsan_suppressions.txt、lsan_suppressions.txt、ubsan_suppressions.txt设置ASAN_OPTIONSsymbolize1:detect_leaks1:intercept_tls_get_addr0并指定ASAN_SYMBOLIZER_PATH指向 buildtools 中的llvm-symbolizer。脚本加载后直接在终端运行具体的单元测试二进制即可所有 Sanitizer 选项和抑制规则都会自动生效。2.2 抑制规则的使用与维护各抑制文件顶部都写有针对该 Sanitizer 的具体添加说明例如 lsan_suppressions.txt 顶部指向 AddressSanitizer/LeakSanitizer 的 suppressions 官方文档。新增抑制条目时须遵循两条铁律抑制规则要尽量详细as detailed as possible过于宽泛的抑制会连真实的新问题一起屏蔽如果预期的问题没有被 Sanitizer 捕获先检查抑制列表里是否有看起来相关的条目必要时选择性禁用部分抑制以复核。运行时 LSan 会输出如下形式的“Suppressions used”统计便于你判断哪些抑制条目在本次运行中实际命中了多少字节----------------------------------------------------- Suppressions used: count bytes template 1 120 class_createInstance 5 80 MakeSkSurfaceFromBackingStore 3 128 _dispatch_once_callout -----------------------------------------------------2.3 其他注意事项Goma 兼容性Sanitizer 构建对 Goma分布式编译的支持不完整官方建议在问题解决前禁用 Goma 以获得更可靠的构建构建命令中统一带--no-goma。问题追踪所有被 Sanitizer 捕获的问题都带[sanitizer]标签归档追踪。仓库内的抑制条目也大量引用对应 issue 编号如flutter::MessageLoop::EnsureInitializedForCurrentThreadLSan 抑制见 lsan_suppressions.txt、fml::MessageLoopTaskQueues::DisposeTSan 抑制见 tsan_suppressions.txt新发现的问题也应照此登记。三、各 Sanitizer 的启用方法与实战命令以下每种 Sanitizer 的命令模式完全一致用tools/gn生成带开关的构建目录 →autoninja编译 → 加载 suppressions → 运行测试。仓库统一使用out/host_debug_unopt作为主机调试unoptimized构建目录。3.1 Leak Sanitizer检测内存泄漏LSan 检测内存泄漏启用开关为--lsan。最佳实践是与 unoptimized 构建变体搭配使用——构建根buildroot在这种模式下会配置理想参数如关闭优化便于符号化与准确回溯。$ ./flutter/tools/gn --runtime-mode debug --lsan --unoptimized --no-goma $ autoninja -C out/host_debug_unopt $ source ./flutter/testing/sanitizer_suppressions.sh $ ./out/host_debug_unopt/embedder_unittestsLSan 既支持独立运行也可与 ASan 联合使用联合时由 ASan 隐式附带。从 lsan_suppressions.txt 可以看到引擎侧维护的典型泄漏抑制类别Dart VM 误报leak:dart::*、Objective-C 类定义leak:class_createInstance、Embedder backing store 的 SkSurfaceleak:MakeSkSurfaceFromBackingStore、TLS 槽中的 MessageLoopleak:fml::MessageLoop::EnsureInitializedForCurrentThread、平台消息未处理导致的泄漏leak:flutter::PlatformViewEmbedder::HandlePlatformMessage、mock 引擎测试中的有意分配leak:*flutter/shell/platform/linux/testing/mock_engine.cc等。3.2 Address Sanitizer检测内存错误ASan 检测 use-after-free、缓冲区溢出等内存错误启用开关为--asan。注意启用 ASan 会隐式启用 LSan因此sanitizer_suppressions.sh会在 ASan 构建中同时开启泄漏检测这正是脚本中ASAN_OPTIONS设置detect_leaks1的原因。$ ./flutter/tools/gn --runtime-mode debug --asan --unoptimized --no-goma $ autoninja -C out/host_debug_unopt $ source ./flutter/testing/sanitizer_suppressions.sh $ ./out/host_debug_unopt/embedder_unittests平台限制ASan 对 aarch64 目标的支持不完整spotty support官方建议在x64 目标上使用以获得最佳效果。3.3 Undefined Behavior Sanitizer检测未定义行为UBSan 捕获未定义行为启用开关为--ubsan。sanitizer_suppressions.sh会为其指定抑制文件ubsan_suppressions.txt其中抑制了 Dart VMthird_party/dart的对齐与空指针类错误以及 SwiftShaderflutter/third_party/swiftshader的未定义行为。$ ./flutter/tools/gn --runtime-mode debug --ubsan --unoptimized --no-goma $ autoninja -C out/host_debug_unopt $ source ./flutter/testing/sanitizer_suppressions.sh $ ./out/host_debug_unopt/embedder_unittestsUBSan 的各类错误如 alignment、null、signed-integer-overflow 等可在运行时按类别禁用。3.4 Thread Sanitizer检测数据竞争TSan 捕获数据竞争启用开关为--tsan。抑制文件 tsan_suppressions.txt 中的条目直观反映了引擎的并发热点Dart VM 内部race:dart::*、thread:dart::*、引擎关闭时 animator 开始帧的竞争race:flutter::Shell::OnAnimatorBeginFrame、race:flutter::Shell::OnAnimatorNotifyIdle、以及fml::MessageLoopTaskQueues::Dispose的竞争。$ ./flutter/tools/gn --runtime-mode debug --tsan --unoptimized --no-goma $ autoninja -C out/host_debug_unopt $ source ./flutter/testing/sanitizer_suppressions.sh $ ./out/host_debug_unopt/embedder_unittests3.5 Memory Sanitizer检测未初始化内存读取MSan 检测对未初始化内存的读取启用开关为--msan。这是唯一一个仅支持 Linux 的 Sanitizer因其依赖特定工具链对全程序的内存插桩。$ ./flutter/tools/gn --runtime-mode debug --msan --unoptimized --no-goma $ autoninja -C out/host_debug_unopt $ source ./flutter/testing/sanitizer_suppressions.sh $ ./out/host_debug_unopt/embedder_unittests四、源码级佐证开关如何从 CLI 抵达构建系统--asan/--lsan/--msan/--tsan/--ubsan五个开关在 tools/gn 中由 argparse 声明为布尔参数随后在同一文件的 GN 参数组装阶段tools/gn逐一映射为is_asan、is_lsan、is_msan、is_tsan、is_ubsan。这些is_*参数会传递给引擎的 BUILD 系统GN进而作用于编译与链接阶段为对应目标注入 sanitizer 插桩与运行库。换句话说你在命令行写的--tsan并不只是“给某个测试加个 flag”而是整个构建根buildroot级别的配置切换——这也解释了为什么文档强调“构建根已为所有目标接线了 sanitizer 构建尝试”以及为何不是所有“架构 × 平台 × sanitizer”组合都能编译通过插桩会递归应用到引擎与 Dart VM 的全部依赖目标上。五、故障排查速查现象排查方向Sanitizer 构建失败或特定测试目标运行失败多为未标注的误报或引擎/Dart VM 真实缺陷先用 suppressions 过滤已知问题再判断剩余失败是否为新问题预期的问题没被 Sanitizer 捕获检查对应 suppressions 文件确认是否被已有条目可能过宽屏蔽考虑选择性禁用抑制后重跑运行出现大量重复已知问题查看 “Suppressions used” 统计判断命中条目对照 issue 编号核实是否为已跟踪问题Goma 下构建不稳定按官方建议禁用 Goma--no-goma等待兼容性问题修复目标平台选择MSan 仅 LinuxASan 在 aarch64 上支持不完整优先 x64六、小结Flutter Engine 的 Sanitizer 支持是一套完整的“发现问题 → 抑制已知 → 持续发现”工作流通过 tools/gn 的--asan/--lsan/--msan/--tsan/--ubsan开关一键生成带插桩的构建通过 testing/sanitizer_suppressions.sh 一键加载全部抑制与环境选项再通过维护 tsan_suppressions.txt、lsan_suppressions.txt、ubsan_suppressions.txt 三个抑制文件来沉淀已知问题、聚焦新缺陷。这套方法论既适用于 Flutter Engine 的本地调试也适用于任何“全量插桩 精细抑制”的 C 大型项目质量建设。赞分享跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载相关推荐Dart SDK 源码级 Sanitizer 调试指南在 Dart VM 中构建与运行 ASan/MSan/LSan/TSan/UBSanDart SDK 源码级 Sanitizer 调试指南在 Dart VM 中构建与运行 ASan/MSan/LSan/TSan/UBSan !IMPORTAN编程语言编译器语言运行时标准库开发工具bRPC 的 Sanitizers 调试支持指南从 ASan 到 LSan/MSan/UBSan 的完整实践bRPC 的 Sanitizers 调试支持指南从 ASan 到 LSan/MSan/UBSan 的完整实践 bRPC 是一个工业级 C RPC 框架其后端RPC框架通信网络drawio-desktop 教程VSDX 文件从打开到交付的完整流程drawio desktop 教程VSDX 文件从打开到交付的完整流程 drawio desktop 是 draw.io 的官方 Electron 桌面应用桌面应用图形学上一篇如何在鸿蒙系统上打造完全自定义的纯净阅读体验开源阅读鸿蒙版终极指南下一篇OpenCore Legacy Patcher深度解析让老款Mac重获新生的完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 2026/9/28 9:42:31

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 网站做好了没人访问,这是很多老板最头疼的事。你花大价钱做的官网,设计精美、功能齐全,但打开一看,流量为零,咨询为零。这时候你才意识到,问题不在“做没做”,而在“怎么快速做出来并推向市场”。面…

阅读更多 →
昇腾910B多机分布式推理:从HCCL到MindIE的DeepSeek部署实践 2026/9/28 9:42:24

昇腾910B多机分布式推理:从HCCL到MindIE的DeepSeek部署实践

昇腾910B上跑DeepSeek多机分布式推理,很多人卡在第一眼:MindIE、HCCL、ranktable、hccn_tool,每个词都眼熟,串起来就不是那么回事。实际踩过一圈之后你会发现,真正决定能不能跑起来的不是模型代码,而是通信…

阅读更多 →
从CANoe到TSMaster:车载总线测试工具链迁移实战指南 2026/9/28 9:42:24

从CANoe到TSMaster:车载总线测试工具链迁移实战指南

搞车载总线测试的工程师,电脑里大概率都装着一套CANoe。我最早接触CANoe是刚入行那会儿,跟着前辈在项目里做网络测试,从报文发送、DBC解析到UDS诊断,基本全是靠Vector这套工具撑起来的。说实话,CANoe确实是这个行业的标…

阅读更多 →
从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地 2026/9/28 9:42:23

从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地

1. 日榜的"热度"到底是怎么算出来的先别急着收藏仓库。每天打开 GitHub 的 Trending 页面,你看到的是过去 24 小时内 Star 增量最高的仓库,周榜和月榜则分别看一周、一个月内的增量。官方没有公开完整排序算法,但用久了会发现&…

阅读更多 →
【Java开发MCP】SSE模式开发并集成MCP:TaoToken统一Key接入与SpringAI WebFlux配置骨架 2026/9/28 9:42:23

【Java开发MCP】SSE模式开发并集成MCP:TaoToken统一Key接入与SpringAI WebFlux配置骨架

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

阅读更多 →
OpenCompass 高效评测:Partitioner 任务切分与 Runner 执行后端实战指南 2026/9/28 9:42:23

OpenCompass 高效评测:Partitioner 任务切分与 Runner 执行后端实战指南

模型评测人工智能大模型AI 评测 【免费下载链接】opencompass OpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, scie…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉