You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何转换Unity WebGL生产环境下不可读的WASM调用栈信息?

Unity WebGL生产环境WASM调用栈还原方案(无调试符号)

问题背景

使用Unity 2022.1.24f1构建WebGL生产包时,触发异常会得到仅包含WASM函数索引和地址的不可读调用栈(示例如下),且无法在生产环境启用调试符号模式。同时发现构建产物中Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Symbols\MethodMap.tsv包含所有方法名,但不清楚其与调用栈中函数编号的关联逻辑。

示例不可读调用栈

Invoking error handler due to
RuntimeError: unreachable
at wasm://wasm/0785b666:wasm-function[985]:0x98818
    at wasm://wasm/0785b666:wasm-function[544]:0x89330
    at wasm://wasm/0785b666:wasm-function[8670]:0x24dccf
    at wasm://wasm/0785b666:wasm-function[1922]:0xbf4e5
    at wasm://wasm/0785b666:wasm-function[28368]:0x812a8b
    at wasm://wasm/0785b666:wasm-function[86902]:0x14c5d3c
    at wasm://wasm/0785b666:wasm-function[557]:0x898ed
    at wasm://wasm/0785b666:wasm-function[77488]:0x1326327
    at wasm://wasm/0785b666:wasm-function[5230]:0x171c41
    at wasm://wasm/0785b666:wasm-function[10658]:0x2feb0d
    at wasm://wasm/0785b666:wasm-function[104320]:0x178c493
    at invoke_iiii (blob:http://localhost:8080/eef1af57-52ea-407d-b414-b8a770143494:3:408461)
    at wasm://wasm/0785b666:wasm-function[2104]:0xc4fc3
    at wasm://wasm/0785b666:wasm-function[24046]:0x7aace3
    at wasm://wasm/0785b666:wasm-function[990]:0x989d5
    at wasm://wasm/0785b666:wasm-function[21506]:0x561c30
    at wasm://wasm/0785b666:wasm-function[51389]:0xd496a6
    at wasm://wasm/0785b666:wasm-function[109425]:0x18f3801
    at wasm://wasm/0785b666:wasm-function[108044]:0x1853d4c
    at wasm://wasm/0785b666:wasm-function[23913]:0x79ec70
    at wasm://wasm/0785b666:wasm-function[23913]:0x79ece1
    at wasm://wasm/0785b666:wasm-function[21361]:0x554206
    at wasm://wasm/0785b666:wasm-function[104316]:0x178c45d
    at browserIterationFunc (blob:http://localhost:8080/eef1af57-52ea-407d-b414-b8a770143494:3:229388)
    at callUserCallback (blob:http://localhost:8080/eef1af57-52ea-407d-b414-b8a770143494:3:182585)
    at Object.runIter (blob:http://localhost:8080/eef1af57-52ea-407d-b414-b8a770143494:3:183845)
    at Browser_mainLoop_runner (blob:http://localhost:8080/eef1af57-52ea-407d-b414-b8a770143494:3:182120)

可行还原方案

前提条件

必须保留与生产构建完全一致的编译产物:

  • Library\Bee\artifacts\WebGL\build.wasm(对应生产包的WASM文件)
  • Library\Bee\artifacts\WebGL\il2cppOutput\cpp\Symbols\目录下的所有文件(包括MethodMap.tsv和FunctionMap.tsv)

方法一:使用Unity自带il2cpp栈解码工具

Unity的il2cpp工具链内置了调用栈解析功能,步骤如下:

  1. 找到Unity安装目录下的il2cpp.exe(Windows路径示例:Unity\Hub\Editor\2022.1.24f1\Editor\Data\il2cpp\build\deploy\il2cpp.exe)
  2. 将生产环境的调用栈保存为文本文件(比如stacktrace.txt)
  3. 执行以下命令:
    il2cpp.exe --stacktrace-decode --wasm-file=build.wasm --method-map=MethodMap.tsv < stacktrace.txt
    
    工具会自动解析调用栈中的函数索引/地址,映射为对应的C#方法名。

方法二:手动解析(结合WASM工具链)

如果自带工具无法使用,可通过以下步骤手动关联:

  1. 获取WASM函数索引与地址的对应关系
    使用WebAssembly Binary Toolkit中的wasm-objdump工具,执行命令:

    wasm-objdump -x build.wasm > wasm_symbols.txt
    

    在输出文件中,查找Function [N]格式的条目(N为调用栈中的函数编号),确认该函数的地址范围,与调用栈中的地址(如0x98818)匹配。

  2. 关联函数索引到C#方法
    打开FunctionMap.tsv文件,其格式为WASM函数索引\til2cpp方法ID,通过调用栈中的函数索引找到对应的方法ID;再用该方法ID到MethodMap.tsv中查找,即可得到完整的C#方法名(包括命名空间和类名)。

注意事项

  • 每次构建的WASM函数索引可能不同,必须使用对应生产包的编译产物进行解析,否则映射结果无效。
  • 生产环境无需启用调试符号,只要构建时保留Library目录下的符号文件,即可离线完成调用栈还原。

内容的提问来源于stack exchange,提问作者Nikita Koshelev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:15:25