原地址:http://www.cnblogs.com/hisiqi/archive/2013/07/21/3203527.html

我们知道,Unity3D在WebPlayer的发布模式下是沙箱环境中运行的。根据Unity3D的官方文档所述,WebPlayer模式下不能使用非托管的DLL,也就是说,传统C++游戏客户端的生成MiniDump所使用的非托管dll——dbgHelp.dll,在.net中也可以使用P/Invoke方式来调用MiniDumpWriteDump,但在WebPlayer模式下却不能用了。

那么在WebPlyaer模式下的Unity3D客户端崩溃时,应该如何收集异常信息呢?

既然不能使用非托管的DLL,不能生成MiniDump,那我们退而求其次,能否得到异常的信息呢?比如发生异常时的调用栈信息,源文件及对应的行号等。

我们不想在任何客户端语句执行的时候,都使用Try Catch来包含,这样会很蛋疼。可以回想一下.net中支持的全局异常捕获的功能:

(1) 使用Application的ThreadException事件

Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

(2) 使用AppDomain的UnHandledException事件

AppDomain.CurrentDomain.UnhandledException+=newUnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

但从实践的结果来看,对于方法1,Unity3D不支持,因为在Unity3D上开发的程序不是Winform类型的应用程序,Application所在System.Windows.Form这个名字空间都无法包含;而对于方法2,其功能是捕获未处理的异常,但在实践中发现,编写的回调函数没有被调用。而在Editor的Console窗口中已经有了异常信息显示,这意味着异常已经被其他的地方处理了(应该是Unity3D的Runtime库里面),这也是在Unity3D这个“壳”里面进行开发的郁闷之处——你无法控制全局,runtime的代码对于我们是不可控的。

所以方法1,2都泡汤了。

再查看了下文档,发现了Unity3D在UnityEngine的Application类中提供了这样一个静态函数:

public static voidRegisterLogCallback(Application.LogCallback handler);

其功能是在Unity3D执行log的时候,可以注册我们的回调函数,我们再看下Application.LogCallback的原型:

public delegate voidLogCallback(string  condition,string  stackTrace,LogType  type);

可以根据LogType来得到我们所需要的错误或者异常信息。需要注意的是,在发布Unity的程序后,Unity依然会产生Log,除了其本身异常或错误的log之外,还有开发人员自己调用的Debug.Log。所以我们完全可以借用Unity3D的log机制来得到异常信息,因为一般我们在编辑器里运行时,Console窗口显示的log信息已经足够丰富了。下面是一个测试小程序,其中故意产生了一次除0异常:

在ProcessExceptionReport中下断点,可以得到如下信息:

注意stackTrace,只要将其以\n结尾展开,就是堆栈格式的信息了,condition表示是异常的情况,在这里是除0异常。

至此,由于我们只需要捕捉错误或者异常,所以需要在回调函数中进行过滤。

得到异常信息之后,就是上报的事情了,在这里就不再进行赘述了,可以专门和异常处理服务器进行通信,上报异常信息。其实如果能得到MiniDump还是最好的,毕竟信息量不一样。如果有哪位兄台可以给出方法,不胜感激!

Unity3D在WebPlayer模式下的异常上报探索的更多相关文章

  1. (转)Unity3D在WebPlayer模式下的异常上报探索

    我们知道,Unity3D在WebPlayer的发布模式下是沙箱环境中运行的.根据Unity3D的官方文档所述,WebPlayer模式下不能使用非托管的DLL,也就是说,传统C++游戏客户端的生成Min ...

  2. python交互模式下cp65001异常

    unknown encoding: cp65001异常 python安装后进入命令行交互模式,输入任何代码都报unknown encoding: cp65001异常 需要将编码(UTF-8)修改为 简 ...

  3. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  4. Unity3D Development模式下的一个小问题

    今天客户提交了一个反馈,说测试版本的应用在按下电源键的时候屏幕变黑,然后重新按下电源键启动的时候发现没有出现屏幕锁屏的情况,直接回到应用界面. 我这边看了一下,发现如果装了360之类的手机助手就没这个 ...

  5. Debug模式下加载文件,运行程序异常的慢

    今天在进行单元测试的时候,debug模式下加载速度很慢,但是run模式下速度很快. 原因:在debug模式下,断点位置不当,解决办法 移除编译器中的所有断点.

  6. Linux Vi/Vim 在插入模式下键盘右边数字键输入异常

    问题:Linux在 Vi/Vim 在编辑文件时遇到一个问题,当我在 Insert 模式下进行修改文件内容的时候,用到了键盘(104键,右边带数字键那种)进行数字输入,当我输入数字 “5” 时,插入的数 ...

  7. Apache Spark源码走读之19 -- standalone cluster模式下资源的申请与释放

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文主要讲述在standalone cluster部署模式下,Spark Application在整个运行期间,资源(主要是cpu core和内存)的申请与 ...

  8. 曲线救国:IIS7集成模式下如何获取网站的URL

    如果我们在Global中的Application_Start事件中访问HttpContext.Current.Request对象,如: protected void Application_Start ...

  9. 软件调试——IA-32 保护模式下寄存器一览

    最近在看张银奎先生的<调试软件>一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧. 1 通用寄存器 EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等 ...

随机推荐

  1. python中的三元表达式

    if B = True: return A else: return C 用三元表达式可以写成: return A if B else C

  2. ORM-老师信息系统

    老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 (自定义第三张表,通过外键与其他两张表关联  但是不能用Django ORM 多对多操作的语法) class Class(mo ...

  3. mysql 如何提高批量导入的速度

    mysql 如何提高批量导入的速度 最近一个项目测试,有几个mysql数据库的表数据记录达到了几十万条,在搭建测试环境 导入 测试数据时,十分慢.在网上搜索了一下,有下面一些方法可以加快mysql数据 ...

  4. NumPy、SciPy 等Python包在Windows下的whl安装包下载

    http://www.lfd.uci.edu/~gohlke/pythonlibs/ 感谢加利福尼亚大学尔湾分校(University of California, Irvine)荧光动力实验室(瞎翻 ...

  5. JS—正则表达式

    正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义. 单个字符和数字 .表示匹配除换行符外的单个字符,两个.就表示匹配两个字符 var ...

  6. 洛谷 P1577 切绳子【二分答案】

    题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位. 输入输出格式 输入格式: 第一行两个整数N和K,接下来N行,描 ...

  7. 21、Flask实战第21天:常用的Flask钩子函数

    在Flask中钩子函数是使用特定的装饰器装饰的函数.为什么叫钩子函数呢?是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码.那么这种函数就叫做钩子函数. before_first_req ...

  8. 微信小程序开发教程(九)视图层——.wxss详解

    WXSS是一套样式语言,用于描述WXML的组件样式. 官方文档表示,WXSS的选择器目前支持(“.class”.“#id”.“elemnt”.“element,element”.“::after”.“ ...

  9. JVM的内存布局

    JVM的内存布局包括,其中: Java虚拟机在执行Java程序的过程中会把它所管理的内存(线程相关?)划分为若干个不同的数据区域.有些区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结 ...

  10. [Contest20180325]序列

    Hogura有一个序列$a$,她希望你帮她维护下面的这些操作. $1\ l\ r\ x$对$l\leq i\leq r$的$a_i$执行$a_i=a_i+x$ $2\ l\ r\ x$对$l\leq ...