unity崩溃查找

这篇具有很好参考价值的文章主要介绍了unity崩溃查找。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

unity崩溃查找

android崩溃日志收集

  • 直接使用logcat日志定位
    unity自己会捕获崩溃,然后在 logcat 输出崩溃堆栈,不管是 java、c#、c++ 崩溃都可以
    因此只要获得logcat日志,就能获得崩溃堆栈

    1. 使用logcat获得日志
    2. 使用dropbox获得日志
    3. 使用bugreport获得日志
  • 手动转储崩溃日志
    主要考虑3个部分:

    • c# 异常
      这一部分已经被unity处理,会通过 Debug.Log 打印,只需要通过 Application.logMessageReceived 捕获日志并写入文件即可
      原理参考 捕获全局异常
      代码参考 unity日志输出到文件
    • java 异常
      可以使用 Thread.setDefaultUncaughtExceptionHandler 捕获 java 异常并写入文件中
      原理参考 用代码捕获android崩溃日志
      代码参考 unity崩溃输出到文件
    • c++ 异常
      这一部分已经被unity处理,会转成 java 异常抛出,所以不需要额外处理

ios崩溃日志收集

  • 使用自带的崩溃日志

  • 手动转储崩溃日志

    • IOS只有C++和C#两层,对于C#来说,和Android是一模一样的,不用多说。
      对于C++这层,Unity已经为ios提供了一个crash report模块,他需要我们将工程生成好后,将 Classes/Crashreport.h 里面的 ENABLE_CUSTOM_CRASH_REPORTER 设置为1,
      这样在c++ crash后,unity会为我们生存crash文件,等下次启动后,可以通过crashreport这个模块访问这些dmp文件,这些dmp文件都是ios上的标准dmp文件,可以使用ios的开发工具symbolicatecrash来查看。
      unity内置的crash report其实也是采用了第三方的库plcrashreport来实现的,这个库在ios上的应用很多。
    • 另外对于ios,其实也提供了一个函数NSSetUncaughtExceptionHandler ,用来当那些未捕捉的异常发生时,进入这个处理,可以拦截一些东西,
      但是一些比如内存访问错误直接就退出了,不会进到这里,另外进到这里之后程序还是会退出,只是让我们可以记录一下,不过有了unity自带的crashreport 这个也就没啥用了。
    • 还有在unity对ios的c#运行中,在player setting里面有个对代码的运行优化,选择slow but safe 还是fast but no exception,如果选择前者,所有c#的执行错误都会像脚本一样被catch住,会报c#的exception,
      如果后者就不会,就直接不catch了,会造成程序退出,但是运行效率是高的,我们通常选择slow but safe。这是mono架构的特性。

调用堆栈地址还原成符号

  • 符号表介绍

    • 首先符号表根据使用的编译参数不同,分为2种,debug 和 public,都能把地址转成函数名,不同的是 debug 会多一些信息,要调试的话只能用 debug 符号表
      debug 符号表后缀为 .dbg.so, public 符号表后缀为 .sym.so,一般 unity 引擎只有 public 符号表,你的游戏逻辑会同时生成 debug 和 public 符号表
      在使用的时候要移除 .dbg 或 .sym 后缀,比如 libunity.sym.so 改成 libunity.so
    • 其次debug和release也会生成不同的符号表,所以一共有4种符号表,debug版本的debug、public符号表,release版本的debug、public符号表
  • 首先定位符号表位置

    • Android
      参考 Unity 用户手册 2020.3 (LTS)/平台开发/Android/构建 Android 应用程序/Android symbols
      • unity引擎只有public 符号表,位于
        /PlaybackEngines/AndroidPlayer/Variations///Symbols//
        开启 Strip Engine Code enabled 后,libunity 会生成一个裁剪后的符号表 /Temp/StagingArea/symbols//
      • 用户代码只有开启 IL2CPP ,才会有符号表
        Il2cpp.so 是游戏逻辑编译出来的,其符号表在打包工程时生成
        • Build Settings 勾选 Create symbols.zip
        • 打包后会在 apk 输出目录生成 {应用名称}-{内部版本号}-v{版本号}.symbols.zip,
          里面就包含 Il2cpp.so 的 public 和 debug 符号表,以及 libunity 经过代码裁剪后的public符号表
  • 然后使用符号表把地址转成函数
    假设堆栈是这样的

        I/DEBUG(242): backtrace:
        I/DEBUG(242):     #00  pc 006d4960  /data/app-lib/com.u.demo-1/libunity.so
        I/DEBUG(242):     #01  pc 006d4c0c  /data/app-lib/com.u.demo-1/libunity.so
    

    则通过以下命令可以获得 006d4960 对应的函数名称
    arm-linux-androideabi-addr2line -f -C -e {unity安装目录}/PlaybackEngines/AndroidPlayer/Variations/{mono或il2cpp}/Release/Symbols/armeabi-v7a/libunity.sym.so 006d4960
    -f - Show function names
    -C - Demangle function names
    -e - Set the input file name
    arm-linux-androideabi-addr2line 位于 {NDK安装目录}/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line文章来源地址https://www.toymoban.com/news/detail-704951.html

unity日志输出到文件

    [DefaultExecutionOrder(-10000)]
    public clas

到了这里,关于unity崩溃查找的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率

    前言 ReferenceFinder 是一个比较小众的插件

    2024年02月16日
    浏览(44)
  • 【Unity 实用工具篇】✨| ReferenceFinder 引用查找插件,提高引擎查找使用效率

    前言 ReferenceFinder 是一个比较小众的插件

    2024年02月14日
    浏览(57)
  • Unity 语法详解之查找游戏物体的方法(含查找隐藏物体)

    为了更好的看懂,有一个非常基础的知识,如果不知道可以移步去了解一下哦 unity | gameobject和transform的区别和关联通俗解释_gameobject transform_菌菌巧乐兹的博客-CSDN博客 一、前情提要 大写的 GameObject是个类,里面写满了物体有关的代码 小写的 gameObject指的是物体本身 大写的

    2024年02月12日
    浏览(46)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(73)
  • Unity 之 GameObject.Find()在场景中查找指定名称的游戏对象

    GameObject.Find 是 Unity 中的一个函数,用于在场景中查找指定名称的游戏对象。这个函数的主要作用是根据游戏对象的名称来查找并返回一个引用,使您能够在代码中操作该对象。以下是有关 GameObject.Find 的详细介绍: 函数签名: 使用方法: 您可以通过将游戏对象的名称作为参

    2024年02月10日
    浏览(37)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(72)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(62)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(69)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(94)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(121)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包