2.8 KiB
HybridCLR Gen All 与 WebGL 原生构建
2026-10-22 故障与处理
当前环境为 Windows、Unity 2022.3.62f3、HybridCLR 8.14.1。
HybridCLR/Generate/All 在 GenerateStripedAOTDlls 内部调用 WebGL Player 构建。
本次错误发生在原生工具链,C# 编译已通过:
clang++编译mscorlib.cpp、UnityEngine.CoreModule__4.cpp时退出,前者返回3221226505,后者包含 LLVM Instruction Selection 崩溃信息。- 两个文件保持原来的
-O3参数单独重编译均成功。 - Bee 并发降为 4 后,全部 C++ 编译通过;随后独立线程池中的
wasm-opt返回3221225477。 - 同一份 wasm 输入、同一优化参数在
BINARYEN_CORES=4下单独处理成功。
上述证据支持限制构建并发作为规避措施,尚不能单独确定内存、硬件或工具链内部缺陷中的哪一项是根因。
项目处理
AIClient/Assets/Editor/HybridCLR/WebGlBuildConcurrency.cs 通过 Unity 构建回调处理 Windows 编辑器中的 WebGL Player 构建,包括标准 HybridCLR Gen All 内部的构建及微信导出:
- 未显式指定时,将当前进程的
BEE_BUILD_THREADS、BINARYEN_CORES临时设为4。 - 保留开发者或 CI 已提供的环境变量值。
- 成功后恢复环境变量;失败时通过编辑器空闲更新恢复,并在程序集重载前清理。
- 保留既有 C++/wasm 优化参数,不修改 Unity 安装目录或 PackageCache。
Bee 的并发环境变量也存在于当前 Unity 自带的 bee_backend.exe 中;本次采样确认 clang 进程数最多为 4。
Binaryen 对并发变量的说明见其官方调试文档。
验证入口与记录
按项目 Unity Pipeline 流程编译后,执行:
unity command --timeout 900 run_script --file AgentScripts/VerifyHybridClrGeneration.cs --entry VerifyHybridClrGeneration.GenerateAll --timeout_ms 900000 --project-path D:/UD/AI/AIGame/AIClient
该入口直接调用原始 PrebuildCommand.GenerateAll(),不自行设置线程环境变量,也不跳过步骤;检查 AOT DLL、生成文件及环境变量恢复。
成功回执写入 Tools/output/hybridclr_genall/generate_all.json。
本次标准流程于 2026-10-22 16:35(北京时间)通过,耗时约 295 秒:生成 55 个 AOT DLL,MethodBridge.cpp、UnityVersion.h、link.xml、AOTGenericReferences.cs 均为本轮更新,环境变量已恢复,生成后的 C# 编译通过。
VerifyHybridClrGeneration.VerifyCallbacks 另行验证了默认并发、成功清理、显式覆盖值保留和失败后空闲清理,全部通过。
辅助工具 Tools/diagnose_webgl_clang.py 和 Tools/diagnose_webgl_wasm_opt.py 从 Editor.log 提取失败命令,将重放输出写入 Tools/output/hybridclr_genall/,不修改 Unity 的构建产物。