如何转换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工具链内置了调用栈解析功能,步骤如下:
- 找到Unity安装目录下的
il2cpp.exe(Windows路径示例:Unity\Hub\Editor\2022.1.24f1\Editor\Data\il2cpp\build\deploy\il2cpp.exe) - 将生产环境的调用栈保存为文本文件(比如
stacktrace.txt) - 执行以下命令:
工具会自动解析调用栈中的函数索引/地址,映射为对应的C#方法名。il2cpp.exe --stacktrace-decode --wasm-file=build.wasm --method-map=MethodMap.tsv < stacktrace.txt
方法二:手动解析(结合WASM工具链)
如果自带工具无法使用,可通过以下步骤手动关联:
获取WASM函数索引与地址的对应关系
使用WebAssembly Binary Toolkit中的wasm-objdump工具,执行命令:wasm-objdump -x build.wasm > wasm_symbols.txt在输出文件中,查找
Function [N]格式的条目(N为调用栈中的函数编号),确认该函数的地址范围,与调用栈中的地址(如0x98818)匹配。关联函数索引到C#方法
打开FunctionMap.tsv文件,其格式为WASM函数索引\til2cpp方法ID,通过调用栈中的函数索引找到对应的方法ID;再用该方法ID到MethodMap.tsv中查找,即可得到完整的C#方法名(包括命名空间和类名)。
注意事项
- 每次构建的WASM函数索引可能不同,必须使用对应生产包的编译产物进行解析,否则映射结果无效。
- 生产环境无需启用调试符号,只要构建时保留Library目录下的符号文件,即可离线完成调用栈还原。
内容的提问来源于stack exchange,提问作者Nikita Koshelev
相关产品推荐
相关产品推荐

