最近几天一直在处理一个很神秘的bug,有天晚上因为这个bug还把我整破防了。这个bug在电脑端运行时不会出现而在手机端运行的时候就会立马跳出来。然而项目中并没有对应用运行平台进行差别化操作的代码,又由于是手机端的缘故报错无法显示出来,所以处理了好几天才找到端倪。(原来是手机性能不及电脑所以生成物体较慢一些导致的时差问题)现对我找出bug的方法进行总结,防止其他人在安卓端无法轻松发现bug而陷入困境。
UI准备
在场景中新建一个文本显示UI来接受debug的报错,如下图所示:
获取报错
将以下代码挂到场景任意物体上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
public Text debug_text;
void Awake()
{
get_error();
}
public void get_error()
{
Application.logMessageReceived += (string condition, string stackTrace, LogType type) => //绑定收到日志消息事件
{
if (type == LogType.Exception || type == LogType.Error) //判断是否是异常或报错
{
debug_text.text = condition + "\n" + stackTrace; //信息打印在屏幕上
}
};
}
}
代码中debug_text是之前添加的文本UI,可以根据自己的需要更换成其他UI类型。
代码判断接受的日志信息是异常和错误类型,也可以根据需要添加其他类型的日志消息。
制造一个错误并打包测试下结果吧:
GameObject.Find("这是一个不存在的东西").GetComponent<SpriteRenderer>();
得到结果如下:
显示报错行数
上面得到的结果虽然知道是哪个函数报错了,但是还是不清楚具体在多少行。在体量比较大的函数中想要找到错误还是不太容易,但是只要在导出安装包的时候勾选这一项就行了(开发模式):
结果如下:
以上就是该解决方案的大致过程,如果有什么问题或者更简便的方法可以在评论区留言。