Unity 符号表

简介: Unity 符号表

前言


关于Unity符号表


       关于项目真机调试时的崩溃问题,一般可以 logcat 或 xcode 看到相关的crash日志,拿到崩溃时的堆栈信息。但是 backtrace 中的地址信息并不直接可见(非debug版本的so库,并不包含符号表等调试信息),因此我们需要拿到对应的符号表,借助 ndk 的 addr2line 工具(arm-linux-androideabi-addr2line.exe,具体须根据调试环境选择)来查看:

image.png        这里主要说下unity的符号表:libunity/libmain——Unity5.3.6 开始的版本都有提供(unity的安装目录下)。

       个人开发主要在 win 平台,对应的符号表目录如下:

image.png

       注1:调试时,符号表版本须与打包APK的Editor版本一致;

       注2:addr2line usage:arm-linux-androideabi-addr2line -f -C -e libunity.sym.so %addr_lst%

-f- Show function names

-C- Demangle function names

-e- Set the input file name

       注3:cocos2dx亦然,没有单独的符号表文件,调试时使用debug版本的so库文件即可;

       注4:若crash的点在li2cpp,则需要关注其符号表——发出apk包中的libil2cpp.so不包含符号表,需要使用打包apk时自动生成的压缩包。

正文


程序crash日志:


image.png

      我们可以通过crash日志信息,查看程序crash在什么地方。

       在这份堆栈信息里,可以看到崩溃时的内存地址,例如0049b647这样的数字。每行的结尾则是所使用的库,例如:libunity.so

       在Unity 5.3.6之后的版本,Unity提供了libunity.so的符号表。

解析


       OK,万事俱备,我们接下来就来解析一下第一条内存地址所对应的方法。

       可以看到crash的方法是三变量的一个方法,如此,我们便可以去debug:

image.png

注意:调试so文件,需要使用对应的 addr2line 工具。

32-bits

NDK \ toolchains \ arm-linux-androideabi-4.9 \ prebuilt \ windows-x86_64 \ bin \ arm-linux-androideabi- addr2line.exe

64-bits

NDK \ toolchains \ aarch64-linux-android-4.9 \ prebuilt \ windows-x86_64 \ bin \ aarch64-linux-android- addr2line.exe

后记


记一次 Bugly 崩溃查找过程 unity-il2cpp:


Bugly 上面的崩溃,刚打开根本看不懂什么函数、什么堆栈...1、 一开始想到的是把 il2cpp 的代码生成符号文件,上传到 bugly 但是找了一大圈,并没有 il2cpp 的符号文件,debug 版本的话 代码也不一样 毫无参考价值;

2、 就算是找到了符号表 也看不懂,il 代码变为 cpp 代码根本看不懂;

3、 开始根据堆栈尝试还原,因为是内存错误,首先想到的是无效指针,或者大内存分配失败,通过可以制造崩溃,然后看 bugly 的堆栈信息是否吻合,如果吻合那么就证明是这里的调用堆栈的问题了。然后查起来就容易多了;

4、崩溃堆栈起始是_pthread_startXXXX, 基本可以断定是我们开的线程里面出错,unity 主线程的话会是 UnityMain。

5、代码里面只有网络部分是自己开的线程,重点审查代码,var x = new byte [1024*1024*1024] 开始逐个可能造成内存错误的代码块插入上述测试代码,开始测试。

目录
相关文章
|
9月前
UE插件开发引用包含第三方库头文件问题总结
UE插件开发引用包含第三方库头文件问题总结
169 0
|
4月前
|
C++
[MFC] 动态链接库的制作过程和使用方法与总结
[MFC] 动态链接库的制作过程和使用方法与总结
41 0
|
6月前
|
IDE 编译器 开发工具
[笔记]vs2015 编写汇编masm32之使用MASM32库
[笔记]vs2015 编写汇编masm32之使用MASM32库
着色器,头文件在“纹理””那节随笔中
着色器,头文件在“纹理””那节随笔中
|
Java 图形学
Unity打包符号表 使用ndk addr2line.exe+符号表 将崩溃内存地址解析成函数名
符号表的路径,符号表发布出来的时候是一个zip文件要把它解压出来,里面会有两个文件:arm64-v8a(64位)、armeabi-v7a(32位)不过unity默认打包出来的都是64位的程序,所以这个前面加上你的真实路径+arm64-v8a\libil2cpp.sym.so就可以了。
IDA交叉引用详解
代码和数据交叉引用分析
429 0
IDA交叉引用详解
Qt 解决程序动态库必须和可执行文件放同一文件夹
文章目录 Qt 解决程序动态库必须和可执行文件放同一文件夹 1 背景 2 使用场景描述 2.1 添加动态库 2.2 更改编译目录 2.3 复制库文件到编译目录并运行程序 2.4 复制库文件到程序根目录 2.5 Release下测试 3 实现动态库文件夹分类 3.1 需求 3.2 实现 3.2.1 查看项目运行配置 3.3 结果 3.3 结果
551 0
Qt 解决程序动态库必须和可执行文件放同一文件夹
|
API C# C++
C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件       这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了。      原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可。
1064 0