客户端异常捕获,是一件必然的事情,特别是在开发的时候就更需要这些有利于找出问题原因的捷径。区别于服务器的是,客户端基本上是以界面为主,你很难在正常运行程序的情况下进行一些输出的监视,如一些日志的记录。开发中我们可以调用一些别的界面来监控输出,但发布的版本则不能。日志的记录在客户端也是必不可少的,但是客户端记录的日志一般都是必要的日志,毕竟客户端最后是放在别人的机器上,我们不能像服务器那边可以随意使用资源。如果客户端的日志过大,则会造成用户的不满,这种不满就决定了你应用的可行性,直观的说你的应用不能被用户所接受。所以在客户端产生异常奔溃的时候,往往会弹出一个提示框,然后将本次奔溃的日志发送到相应的异常资源收集服务器上,这样方便开发人员进行跟踪调试。

CODE

模块exception文件base.h

/**
* PAP Engine ( -- )
* $Id base.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-17 10:57:14
* @uses vengine exception base functions
*/
#ifndef VENGINE_EXCEPTION_BASE_H_
#define VENGINE_EXCEPTION_BASE_H_ #include "vengine/config.h" //ref from http://www.codeproject.com/tools/minidump.asp
//generate stack frame pointers for all functions - same as /Oy- in the project
#pragma optimize("y", off) namespace vengine_exception { namespace base { VENGINE_API void process(PEXCEPTION_POINTERS exception, bool run_crashreport);
VENGINE_API void showstring(const char* format, ...);
VENGINE_API void showassert(const char* filename,
uint16_t fileline,
const char* exception);
VENGINE_API int32_t processinner(PEXCEPTION_POINTERS exception,
HWND hparentwnd,
const char* title);
}; //namespace base }; //namespace vengine_exception #define VENGINE_SHOW vengine_exception::base::showstring
#define VENGINE_ASSERT(condition) \
if (!condition) { \
vengine_exception::base::showassert(__FILE__, \
__LINE__, \
#condition); \
} \
// do { \
// } while (0); #endif //VENGINE_EXCEPTION_BASE_H_

模块exception文件errorinfo

/**
* PAP Engine ( -- )
* $Id errorinfo.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-17 12:02:16
* @uses vengine exception error info functions
*/
#include "vengine/config.h" namespace vengine_exception { #pragma optimize("y", off) namespace errorinfo { bool create_smallinfo_dumpfile(PEXCEPTION_POINTERS exception,
char* filename,
uint16_t lasterror);
bool create_biginfo_dumpfile(PEXCEPTION_POINTERS exception,
char* filename,
uint16_t lasterror);
bool create_dumphelp_file(PEXCEPTION_POINTERS exception,
char* filename);
}; //namespce errorinfo }; //namespace vengine_exception

方法解释

//捕获异常,第一个为异常指针,第二个是指是否运行crashreport(异常收集器)
void process(PEXCEPTION_POINTERS exception, bool run_crashreport);
void showstring(const char* format, ...); //异常抛出
//异常中断,第一个为中断的文件名,第二个为中断的行数,第三个为异常字符串
void showassert(const char* filename, uint16_t fileline, const char* exception);
//异常捕获,区别于第一个方法的是,此异常为内部的,没有异常收集器
int32_t processinner(PEXCEPTION_POINTERS exception,
HWND hparentwnd,
const char* title); errorinfo::create_* //函数,用来创建异常信息文件

SIMPLE

天龙八部的异常收集:

总结

异常收集是客户端比较重要的一部分,因为开发过程中不会出现的问题,不一定在发布的时候出现,也不一定在别的机器上不会出现。异常收集已经成了应用常见的一个模块,几乎所有的应用都会有这样的工具,或前台或后台的收集。下一节要讲的是客户端变量模块。

MMORPG大型游戏设计与开发(客户端架构 part5 of vegine)的更多相关文章

  1. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  2. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  3. MMORPG大型游戏设计与开发(UI SYSTEM SHOW)

    接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...

  4. MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)

    核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...

  5. MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)

    我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...

  6. MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)

    在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...

  7. MMORPG大型游戏设计与开发(客户端架构 part2 of vgui)

    这一节我将讲解vgui的基础系统部分,也是该库提供给外部使用的一些重要接口.作为UI部分比较重要的部分,该节有着至关重要的部分,如果没有看到上一节内容,请留意下面的连接.我们现在可以猜想一下在客户端U ...

  8. MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)

    由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...

  9. MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)

    时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...

  10. MMORPG大型游戏设计与开发(客户端架构)

    首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...

随机推荐

  1. git node(&npm)安装

    1.git 下载地址:https://git-scm.com/download/win 2.node 下载地址:https://nodejs.org/en/download/ 安装node会自带npm ...

  2. 原生JS实现轮播+学前端的感受(防止走火入魔)

    插件!插件!天天听到有人求这个插件,那个插件的,当然,用第三方插件可以大幅提高开发效率,但作为新手,我还是喜欢自己来实现,主要是我有时间! 今天我来给大家分享下用原生JS实现图片轮播的写法 前辈们可以 ...

  3. 从零开始,做一个NodeJS博客(零):整体规(chui)划(niu)

    标签:NodeJS,Heroku 0 搭建一个个人独立博客,这是我好久之前就在计划的一件事了. 这个暑假,我学习了廖雪峰老师的NodeJS教程,又偶然在V2EX上发现了Heroku这个平台,可以免费在 ...

  4. sqlite使用xcode编译

    使用xcode去开发makefile的project(Building Makefile Projects With Xcode) 新建工程,template选择 external Build Sys ...

  5. tomcat部署java servlet的3种方式

    1.将编译好的class文件按照与工程中的package的目录结构一致的文件夹底下 2.将你的servlet封装成 .war(web application archive格式的后缀名) 格式的文档直 ...

  6. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

  7. iOS 跳转到系统的设置界面

    跳到健康设置   上网找了一下  你会发现很难找到.代码如下  不信你试试 . NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy& ...

  8. AFNetworking简单用法

    GET请求 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:URL parameters:ni ...

  9. myIsEqualToString

    BOOL myisEqualToString(NSString * str1 , NSString * str2){ //1.如果两个字符串,指针地址相等,就说明一定是相等 if(str1 == st ...

  10. Hibernate 事务管理

    一. 事务包含四个基本特性:简称ACID: 1. Atomic(原子性):全部成功或全部失败: 2. Consistency(一致性):只有合法数据才能被写入,不合法则回滚到最初状态: 3. Isol ...