鱼C论坛

 找回密码
 立即注册
查看: 5920|回复: 1

[技术交流] CrashRpt程序崩溃捕获的一点皮毛

[复制链接]
发表于 2017-11-9 14:53:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 三更未眠 于 2017-12-13 11:32 编辑

      最近在做软件异常捕获的工作,然后发现有些异常是try catch 捕获不到的;作为一个刚入坑不算太久的小白菜,真的是不知道这个世界是怎么了;机缘巧合之下得知CrashRpt这个库,然后就从网上扒了一个下来,大致的了解了一下整个库的功能;
      通过了解,这个库能捕获的异常还是蛮多的,目测可以捕获十多种;由于英文不是很好,并不是很清楚能够捕获到哪些异常;网上对于这个库的介绍也挺多的,有时间的同学可以去官网:http://crashrpt.sourceforge.net/docs/html/simple_example.html直接阅读文档进行深入的学习;源文件下载:https://sourceforge.net/projects/crashrpt/files/?source=navbar;这个开源项目是用vs2010写的如果你不介意你的程序发布时带上vc10运行库的话可以把bin目录下的某些文件直接移植过去使用(你的程序是vs2010开发可忽略);网上有篇介绍这个怎么使用这个库的博文(个人认为是比较好的):http://blog.csdn.net/shining100/article/details/7760872,对于博文中转换版本的方法我自己使用了一下,感觉不是很理想;可能是我比较小白,我是用vs2008开发的,所以就自己用vs2008重新搭建了CrashRpt里边自己需要用到的几个Prj;然后把新生成的lib文件和头文件包含到所需头文件和lib文件到相对应的Prj就可以了;
      关于使用这个库我自己的一些心得:在准备好所有以上所需的食材之后;我们就可以开始把这个库应用到自己的项目里去了;crashrpt_lang.ini是用来调整CrashSender界面上显示的内容的;整个流程就是你在自己的主程序入口函数处组装好一些信息(例如appName、报告要发送的服务器地址:Url等等),然后就通过CrashRpt里边的一个函数crInstall安装异常句柄到你的程序里;紧接着的就是一些程序崩溃时被CrashRpt捕获到所需要上传到服务器的文件了(dump、log、config等等),还有收集用户使用环境的信息之类的;  然后在你的入口函数末尾crUninstall释放掉;依葫芦画瓢的做完这些之后你的程序就已经使用上CrashRpt了;当你的程序崩溃时就会触发CrashRpt;然后就会进行你之前所设置的一些操作(生成dump文件、屏幕截图等)然后就压缩成一个压缩包;然后就启动CrashSender弹出界面,然后就是用户点发送了,在文件生成的目录下C:\Users\Administrator\AppData\Local\CrashRpt\UnsentCrashReports\会有一个日志文件去记录到底有没有上传成功;自己打开看看就知道了;
       说说URL的事情;由于我只是个小白菜,对于跟服务器交互这块还不是很熟悉;已经可以各种solo的可以忽略这段;这个Url是包含了哪些东西呢,这得看你服务器那边需要什么,是怎么设置的,一般的后台没有给你接口,没有让你传参数,没有校验的就直接http://XXX.XXXX.com/XXX/index.php是这样子的就可以成功了,然后我们需要使用后台接口,得传参、需要校验的呢,你就得去组装这个Url了,我是比较小白的,我是直接在后边添加接口,参数等等所需信息的;怎么在后边添加info呢,举个栗子:http://XXX.XXXX.com/XXX/index.php   ==》http://XXX.XXXX.com/XXX/index.php?t=stat_StatActionAPI&a=collapseLog&ak=ch4j8b; 相信鱼油们都是冰雪聪明的,自己对比下就知道怎么玩了;基本上的使用就是酱紫了;
      扒下一个库,先调通,后续的再根据自己需要的去做调整;当你觉得心烦的时候,点上一根烟,放下所有的思绪,让自己的灵魂飞一会;

=====后续-1:修改生成文件夹的名字
      在使用这个库之后我们发现生成的文件名是一串guid,而这串guid是通过CoCreateGuid去生成的唯一guid,如果我们想改改文件名怎么办?我想使用毫秒级的系统当前时间作为文件名,这样自己也能准确的知道用户软件崩溃的时间,可以帮助后台去查看日志。获取系统时间用GetLocalTime,然后我们就要看在哪里修改了。CrashRpt这个工程里的CrashHandler是把用户所需的信息收集起来并写到共享内存,然后CrashSender的CrashInfoReader再从共享内存里读出来,然后做一些生成某某文件,生成一个文件夹,把这些所需的文件放到这个文件夹,最后再启动发送到服务器的功能,至此整个捕获异常的过程就完成了。那么我们要在哪里修改呢?CrashRpt的Utility里边封装了个获取Guid的函数GenerateGUID。我们自己写个函数来代替这个函数就可以了,调用的话还是在CrashRpt的CrashHandler里边,1.3版本的在Init函数里,1.4版本的在PreCrashInit函数里,自己找找。至此我们就实现了崩溃上报文件名的修改。

=====后续-2:使用duiengine界面库搭建CrashRpt新界面
        1、使用vs创建win32项目
        2、修改资源文件.rc文件--界面库用的语言,生成程序的版本号等等,删除掉自动生成的mfc界面(dialog、menu等)
        3、到项目属性里设置duiengine头文件和lib文件的路径、资源处设置duiengine的头文件路径、生成事件-->预生成事件-->命令行里添加资源生成的命令(对照demo来设置)、还有一些常规性的设置(比如:exe生成的路径)就根据自己的需要来设置了
        4、模拟duiengine的demo项目创建项目结构以及对应的文件
        5、index.xml---导入资源、init.xml---定义资源名字、def_xxx.xml---duiengine自带文件
        6、入口函数(int APIENTRY _tWinMain)---对照demo的入口函数依葫芦画瓢对这个界面库一些初始化(分三部分:初始化 + 自己所搭建界面的启动 + 资源的释放)
       
步骤到了这里整个项目就搭建起来了、剩下的就是使用duiengine去开发新样式的界面了(使用了这个界面库快半年了,转换一下界面库来对比一下跟wtl界面在搭建上的差别)
       

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-9 15:04:53 From FishC Mobile | 显示全部楼层
路过学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表