安卓闪退排查笔记

时间:2021-01-01 16:44:35

持续更新

最后更新于  2017.10.04


1、C++非法内存访问 (2017.08, 9小时)

现象:进入游戏场景后闪退

原因:协议写在C++里, c++ dll 里有一个关于  int64 类型 to octets 的代码,中间掺杂了 union ,在各种强转. (RoleID)

线索1:在崩溃时保存logcat内容,会找到提示非法内存访问(搜索unityMain,或 sig0?)

线索2:错误信息里有函数名和发生异常的地址偏移(相对于函数入口),大致能猜到执行到哪里。(精确定位需要看汇编代码).

解决方法:重写了转换的代码,避免union.


2、内存不足,被LowMemoryKiller干掉了  (2017.10.04, 3小时)

现象:打开背包,屏幕突然变成竖屏,然后闪退。

原因:内存不足,系统开始各种干掉Application.自然就被干掉了.

线索1:Process com.***.*** (pid 27188) has died.

线索2:WIN DEATH: Window{43c8eb70 u0 com.***.***/com.unity3d.player.UnityPlayerActivity}

解决方法:1、确保是这个问题,订阅UnityEngine.Application.lowMemory 事件; 然后再根据log查看确诊。

10-04 01:31:27.171: I/Unity(17674): (Filename: ./artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
10-04 01:32:20.500: E/Unity(17674): [f=1874, time=85.857] [error]Memory Low!
10-04 01:32:20.500: E/Unity(17674):
10-04 01:32:20.500: E/Unity(17674): (Filename: ./artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
10-04 01:32:32.045: E/Unity(17674): [f=2184, time=97.402] [error]Memory Low!
10-04 01:32:32.045: E/Unity(17674):
                  2、设备上查看内存的方法:  (mono 的在设备上看不到,只能通过allocated侧面反映)
                   float m = (1024.0f * 1024.0f);                    System.Text.StringBuilder sb = new System.Text.StringBuilder();                    sb.AppendFormat("FPS : {0:N0}\n", fps)                    .AppendFormat("mono used\t: {0:F6}\n", Profiler.GetMonoUsedSizeLong() / m)                    .AppendFormat("mono heap\t: {0:F6}\n", Profiler.GetMonoHeapSizeLong() / m)                    .AppendFormat("alloc\t\t\t\t: {0:F6}\n", Profiler.GetTotalAllocatedMemoryLong() / m)                    .AppendFormat("reserved\t\t: {0:F6}\n", Profiler.GetTotalReservedMemoryLong() / m)                    .AppendFormat("unused re\t: {0:F6}\n", Profiler.GetTotalUnusedReservedMemoryLong() / m);                    fpsText.text = sb.ToString();