目录
- SO文件
- 符号表
- 对调试和分析的重要性
- 调试方面
- 分析方面
- 错误数据
- 安装Logcat
- 解释符号表
- 设置符号文件路径
- 生成解析
- 相关参考
SO文件
so 文件(Shared Object File,共享目标文件)和符号表紧密相关,它们在程序的运行、调试和分析过程中扮演着不同但又相互配合的角色。
符号表
符号表是.so 文件的关键辅助信息:.so 文件包含了可执行代码、数据以及其他相关信息,是程序在运行时动态链接和加载的对象。符号表则存储了.so 文件中函数、变量等符号的相关信息,如名称、类型、地址等。在程序运行时,动态链接器需要借助符号表来解析.so 文件中函数和变量的引用。例如,当一个程序调用.so 文件中的某个函数时,动态链接器通过符号表找到该函数在.so 文件中的实际地址,从而实现正确的函数调用,确保程序能够顺利运行。
对调试和分析的重要性
调试方面
在调试包含.so 文件的程序时,符号表不可或缺。调试器(如 GDB、IDA 等)利用符号表将程序运行时产生的地址信息(如栈回溯中的函数地址)转换为有意义的函数名和代码行号。对于 Unity 开发中出现问题的.so 文件(如日志中涉及的libil2cpp.so和libunity.so),通过符号表,开发人员可以快速定位到问题函数所在的源文件位置,查看函数参数和局部变量的值,便于分析程序出错的原因,提高调试效率。
分析方面
在进行性能分析或逆向工程分析时,符号表能帮助分析人员理解.so 文件的内部结构和功能。性能分析工具可以借助符号表将性能数据(如函数执行时间、调用次数)与具体的函数名关联起来,确定性能瓶颈所在。在逆向工程中,虽然符号表会增加一定的分析难度,但对于开发者自身分析代码逻辑、发现潜在安全漏洞也有帮助,同时在代码混淆时,符号表可配合保留关键信息,辅助后续的必要分析。
错误数据
举例说明
在查看Unity打包的日志看到崩溃日志信息,其中一段是这样的。
这些 native: #00 pc xxxxx 地址对应的函数不知道是什么,其实我们的Unity就可以看,我们需要安装一个Unity Android Logcat包。
安装Logcat
我们点击Unity、Window、Package Manager,打开包管理器安装Android Logcat
安装好之后在菜单的Window、Analysis、Android Logcat打开
通常我们连接安卓设备可以查看设备的Logcat,不用专门开Android Studio。
这个工具还可以解释符号表。
解释符号表
我们通过右上角Stacktrace打开。
Original的内容里,你可以把崩溃数据复制上来。
设置符号文件路径
右边的Configure Symbol Paths里你可以添加你生成apk时候生成的symbols文件,通常是libil2cpp.so文件。
这个文件通常在打包apk的时候生成,如果是Unity里打包可以勾选生成symbols.zip
打包结束后可以看到压缩文件夹,解压后可以看到so文件。
生成解析
最后我们点击Resolve Stacktraces按钮就解释了
这样就可以看到调用了什么函数了,方便我们能够锁定问题。
相关参考
https://docs.unity3d.com/6000.0/Documentation/Manual/android-symbols.html