此时我们美美的用Unity打了一个安卓包,打开玩了一会以后游戏突然崩溃了,然后我再也不能复现这个问题了!!!怎么办?留着这个坑给玩家吗?不可能的…
所以就有了日志记录器,在崩溃之前拦截异常和日志写入文件内,我们就能找到错误的蛛丝马迹了。
1.C#异常拦截
有着这样的一个委托,所有未被捕获的异常都会被传入这个委托,这个委托就是异常的最后防线。
我们只需要这样就可以拦截未捕获的异常,把异常信息和堆栈信息写入文件,或者按照我们自己的方式处理
AppDomain.CurrentDomain.UnhandledException+=CurrentDomain_UnhandledException;
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
我们只需要在CurrentDomain_UnhandledException中写入一些异常信息,即可保存
2.Unity日志拦截
原理相同,还是一个拦截委托,我们可以把日志类型和日志信息写入文件。
另外UnityEngine.Debug.LogException和throw Exception的区别其实不大,throw和LogEx都会暂停编辑器,但是LogEx是带有Unity相关的堆栈的。
Application.logMessageReceived += Record
void Record(string logString, string stackTrace, LogType type)
3. C# 堆栈跟踪
string traceInfo = new StackTrace((Exception)(e.ExceptionObject)).ToString();
也就是说这个东西StackTrace的构造函数里,参数是一个Exception,能获取到这个异常的堆栈信息,ToString之后就是我们需要的字符串。
4.写入文件
可以考虑写入Application.persistentDataPath中,这个文件夹在各种平台可读写,但是Unity提供了一种打包方式”DevelopmentBuild“可以展示控制台,不过这种方式没法防范程序突然崩溃,而一般崩溃由异常导致。
using System.IO;
StreamWriter writer = new StreamWriter(Application.persistentDataPath);
writer.Write(日志);
writer.Close();