在这里插入图片描述

此时我们美美的用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();