写点什么

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析 Bugly 捕获)

作者:陈言必行
  • 2023-04-17
    辽宁
  • 本文字数:3651 字

    阅读完需:约 12 分钟

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

一,工具集成

Logcat 是开发者必备的工具,调试 app 时的闪退,异常,等问题都可以在这里看到。

Android Logcat 包是在 Unity Editor 中显示来自 Android 设备的堆栈跟踪和日志等消息。


1.1 注意事项

Android Logcat 软件包需要 Unity 2019.4 或更高版本以及 Android 支持模块。需要添加 Android 模块:


导入前需要注意:确保你的工程已加载 Android 模块,并且可以切到 Android 平台。

确认后在“build Settings”窗口中切换到 Android 构建目标。



1.2 导入插件

在 Package Manager(Window” --> PackageManager)界面中导入:


插件简介:

Android Logcat 软件包支持:

  • Android:日志消息

  • Android:应用程序内存统计

  • Android:屏幕捕获

  • Android:屏幕记录器

  • Stacktrace:实用程序

可以通过“Window > Analysis > Android Logcat ”在 Unity Editor 中访问该窗口。

窗口打开快捷键:Windows 按“Alt+6”;macOS “Option+6”


二,连接设备

Android Logcat 软件包支持 USB 和无线连接。本节介绍如何将 Android 设备连接到 Android Logcat 窗口。

2.1 使用 USB 连接

当您打开 Android Logcat 窗口时,Unity 会自动将任何 USB 连接的 Android 设备添加到设备列表中。

手机连接上 USB 之后,需要选择:传输文件。若没有此选项,则需要打开开发者模式。

PS: 在手机版本上多次点击才可以唤醒出开发者模式,再次点击则有吐司提示您已处于开发者模式,这时再去更多设置中去找开发者模式并开启即可。

检测上之后,即可在窗口中看到实时日志了:



2.2 无线连接

要将 Android 设备连接到 Android Logcat 窗口:

无线连接,还是得先使用 2.1 方式使用 USB 链接一下,然后打开 Android Logcat 窗口,从工具栏中,选择“设备选择器”。

选择其他连接选项:


在打开的窗口中,找到对应设备点击 Connect:

连接成功提示:(不使用 USB 方式链接,直接输入 IP 地址,总是链接失败,不知道为什么[\疑惑])


连接成功后,拔掉 USB 连接,就可以在可用设备窗口,找到 Wifi 链接的了:


PS:一次只能连接到一个设备。要选择要连接的设备,请使用 Android Logcat 窗口中的设备列表。此列表包含已连接设备的设备 ID。

可以看到实时日志了:


若需要断开连接,可以在连接窗口对应设备后点击“Disconnect”:

再次连接,直接点最下面的 Connect 链接,即可链接成功。


三,实用功能介绍

3.1 通用介绍

  1. 筛选包名查看日志点击No Filter,在弹出的下拉菜单中,即可选择当前运行应用的包名,进行查看当前应用的相关日志:


  1. 筛选日志信息 Logcat 工具支持在搜索框输入正则表达式检索和区分大小写功能:


  1. Reconnect 重新连接,Disconnect 断开链接当我们出现一个问题,需要查看日志时,为了防止日志太多将需要查看的日志刷过去,则可以点击 Disconnect 断开链接,停止捕获更新日志信息。需要再次查看日志时,点击 Reconnect 重新连接。



3.2 堆栈跟踪工具 -- 解析 Bugly 捕获报错

Tools下拉菜单下选择Stacktrace Utility 可以打开工具面板:


准备工作:指定符号表)

Project Setting面板 -> Analysis -> Android Logcat Settings 中设置:


PS:打包时用的哪个就导入哪个,看你打包时的工程设置:Player -> Configuration

若不指定会在解析时报错提示:

At least one symbol path needs to be specified.Click Configure Symbol Paths and add the necessary symbol path.

举个例子:解析 Bugly 捕获报错

操作步骤:复制 Bugly 报错到工具Original界面,然后点击 Resolve Stacktraces 即可:


解析前日志:

at libunity.0x577cd8(Native Method)at libunity.0x583bdc(Native Method)at libunity.0x5844b8(Native Method)at libunity.0x583870(Native Method)at libunity.0x58380c(Native Method)at libunity.0x1d9058(Native Method)at libil2cpp.0x2bd4b20(Native Method)at libil2cpp.0x2bd6008(Native Method)at libil2cpp.0x278083c(Native Method)at libil2cpp.0xb8dc68(Native Method)at libil2cpp.0xb8dac8(Native Method)at libunity.0x566cf4(Native Method)at libunity.0x574f98(Native Method)at libunity.0x581a0c(Native Method)at libunity.0x5815e8(Native Method)at libunity.0x583620(Native Method)at libunity.0x583b44(Native Method)at libunity.0x5844dc(Native Method)at libunity.0x583870(Native Method)at libunity.0x58380c(Native Method)at libunity.0x1d9058(Native Method)at libil2cpp.0x2bd4b20(Native Method)at libil2cpp.0x2bd6008(Native Method)at libil2cpp.0x278083c(Native Method)at libil2cpp.0xb8dc68(Native Method)at libil2cpp.0xb8dac8(Native Method)at libunity.0x566cf4(Native Method)at libunity.0x574f98(Native Method)at libunity.0x581a0c(Native Method)at libunity.0x5815e8(Native Method)at libunity.0x583620(Native Method)at libunity.0x583b44(Native Method)

解析后日志:

at libunity.0x577cd8 (ScriptingInvocation::ScriptingInvocation(ScriptingObjectPtr, ScriptingMethodPtr) at ??:?)(Native Method)at libunity.0x583bdc (MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodPtr, ScriptingObjectPtr, ScriptingExceptionPtr*) at ??:?)(Native Method)at libunity.0x5844b8 (MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodPtr, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x583870 (MonoBehaviour::StartCoroutine(char const*, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x58380c (MonoBehaviour::StartCoroutineManaged(char const*, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x1d9058 (MonoBehaviour_CUSTOM_StartCoroutineManaged(ScriptingBackendNativeObjectPtrOpaque*, ScriptingBackendNativeStringPtrOpaque*, ScriptingBackendNativeObjectPtrOpaque*) at ??:?)(Native Method)at libil2cpp.0x2bd4b20 (__start_il2cpp at ??:?)(Native Method)at libil2cpp.0x2bd6008 (__start_il2cpp at ??:?)(Native Method)at libil2cpp.0x278083c (__start_il2cpp at ??:?)(Native Method)at libil2cpp.0xb8dc68 (BrotliDecoderVersion at ??:?)(Native Method)at libil2cpp.0xb8dac8 (BrotliDecoderVersion at ??:?)(Native Method)at libunity.0x566cf4 (scripting_method_invoke(ScriptingMethodPtr, ScriptingObjectPtr, ScriptingArguments&, ScriptingExceptionPtr*, bool) at ??:?)(Native Method)at libunity.0x574f98 (ScriptingInvocation::Invoke(ScriptingExceptionPtr*, bool) at ??:?)(Native Method)at libunity.0x581a0c (Coroutine::InvokeMoveNext(ScriptingExceptionPtr*) at ??:?)(Native Method)at libunity.0x5815e8 (Coroutine::Run(bool*) at ??:?)(Native Method)at libunity.0x583620 (MonoBehaviour::TryCreateAndRunCoroutine(ScriptingObjectPtr, ScriptingMethodPtr, Coroutine**) at ??:?)(Native Method)at libunity.0x583b44 (MonoBehaviour::HandleCoroutineReturnValue(ScriptingMethodPtr, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x5844dc (MonoBehaviour::InvokeMethodOrCoroutineChecked(ScriptingMethodPtr, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x583870 (MonoBehaviour::StartCoroutine(char const*, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x58380c (MonoBehaviour::StartCoroutineManaged(char const*, ScriptingObjectPtr) at ??:?)(Native Method)at libunity.0x1d9058 (MonoBehaviour_CUSTOM_StartCoroutineManaged(ScriptingBackendNativeObjectPtrOpaque*, ScriptingBackendNativeStringPtrOpaque*, ScriptingBackendNativeObjectPtrOpaque*) at ??:?)(Native Method)at libil2cpp.0x2bd4b20 (__start_il2cpp at ??:?)(Native Method)at libil2cpp.0x2bd6008 (__start_il2cpp at ??:?)(Native Method)at libil2cpp.0x278083c (__start_il2cpp at ??:?)(Native Method)at libil2cpp.0xb8dc68 (BrotliDecoderVersion at ??:?)(Native Method)at libil2cpp.0xb8dac8 (BrotliDecoderVersion at ??:?)(Native Method)at libunity.0x566cf4 (scripting_method_invoke(ScriptingMethodPtr, ScriptingObjectPtr, ScriptingArguments&, ScriptingExceptionPtr*, bool) at ??:?)(Native Method)at libunity.0x574f98 (ScriptingInvocation::Invoke(ScriptingExceptionPtr*, bool) at ??:?)(Native Method)at libunity.0x581a0c (Coroutine::InvokeMoveNext(ScriptingExceptionPtr*) at ??:?)(Native Method)at libunity.0x5815e8 (Coroutine::Run(bool*) at ??:?)(Native Method)at libunity.0x583620 (MonoBehaviour::TryCreateAndRunCoroutine(ScriptingObjectPtr, ScriptingMethodPtr, Coroutine**) at ??:?)(Native Method)at libunity.0x583b44 (MonoBehaviour::HandleCoroutineReturnValue(ScriptingMethodPtr, ScriptingObjectPtr) at ??:?)(Native Method)


参考:官方文档

发布于: 刚刚阅读数: 3
用户头像

陈言必行

关注

公号:开发同学留步 2019-03-12 加入

我是一个从事Unity游戏开发攻城狮,InfoQ&阿里云签约博主,CSDN博客专家,U3D论坛版主,6年开发经验,助你日常不加班。⽂章皆为从零到⼀的⼊⻔级教程,也有很多⼯作中遇到的问题解析。

评论

发布
暂无评论
Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)_Unity_陈言必行_InfoQ写作社区