我们知道,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还是最好的,毕竟信息量不一样。如果有哪位兄台可以给出方法,不胜感激!

最新文章

  1. Spring Security 3整合CAS 实现SSO
  2. React Native填坑之旅--ListView篇
  3. Nginx 笔记与总结(6)Location:精准匹配
  4. C# 中使用 OpenSSL 的公钥/私钥进行加密和解密
  5. java的InputStream和InputStreamReader有什么区别??
  6. Python基础知识拾遗
  7. msf help.
  8. springboot swagger2 泛型踩坑记
  9. redhat7.3 superset的离线安装
  10. js中的模块化
  11. express koa koa2 优缺点分析
  12. linux的压缩解压命令全解
  13. emwin之在WM_INIT_DIALOG分支下使用带触发功能的函数的程序框架
  14. java多线程快速入门(二)
  15. JSX 和 template 随想
  16. Madgwick IMU Filter
  17. jquery 查询IP归属地
  18. HTML5 ShadowDOM & CustomElements
  19. Xposed模块开发基本方法记录
  20. 算法笔记_012:埃拉托色尼筛选法(Java)

热门文章

  1. MVC 自定义HtmlHelper帮助类型之分页
  2. 查找算法总结Java实现
  3. Node.js 编码转换
  4. mongodb的集合操作
  5. ubuntu 安装wxpython以及boa-constructor
  6. Swift : missing argument label 'xxx' in call
  7. ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决
  8. C#字节数组的常用解码处理方法
  9. mysql-5.7.15-winx64配置
  10. 关于oracle的sqlplus的另一些小技巧