持续更新
最后更新于 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)2、设备上查看内存的方法: (mono 的在设备上看不到,只能通过allocated侧面反映)
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):
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();