本发明涉及故障监视定位,尤其涉及一种基于qt多进程框架下的故障自动定位方法。
背景技术:
1、当软件在运行过程中发生故障崩溃退出后,经常面临以下情况,导致软件故障难以定位,软件质量问题无法修复。
2、1)故障发生无据可查
3、一方面,软件运行出错退出后,没有记录任何可用信息,无法明确出错的模块和代码。另一方面,软件运行和操作日志是记录软件状态和重要操作的日志,只有在运行正常情况下能够输出,且只覆盖了软件部分功能和流程节点,无法覆盖全部函数代码,软件运行日志和操作日志很多情况下都不能反映故障真实情况,不能直接作为故障定位的依据。
4、2)故障现象难以复现
5、软件故障有多种情况,在很多情况下,即使进行相同的操作、输入相同的数据,故障现象不一定出现。另外,有些故障发生概率较低,例如异常值、临界值的处理问题等,需要几天、几周甚至更长时间才能发生,对于故障的排查带来的很大的难度。
6、3)故障发生通知缺乏实时性
7、在多进程框架中,部分进程插件可能没有界面或者界面没有打开,当进程软件发生故障后,软件工作停止,导致业务功能失常。若没有及时通知用户,会造成功能持续不可用,导致后续长时间一系列损失,造成损失的扩大。
8、4)故障信息处理不及时
9、若软件发生故障时,用户未及时处理,过一段时间再回顾当时故障发生状态时,已经记不清故障发生的具体时刻、进行的操作、输入的数据和状态。故障发生时机和故障现象描述不准确,为软件故障定位带来更多的不确定性。另外,某些重要日志可能会被其他日志覆盖或删除,导致故障信息丢失,致使故障难以定位。
10、软件故障定位传统方法之一是采用详细日志记录方法,在重要函数的入口和出口增加运行记录。当软件发生故障后,通过查看日志文件,若发现只在函数入口记录了日志,但出口未记录日志,则可定位发生该函数故障。但该方法只会定位到函数,不会定位到具体代码行,而且若函数被高频率调用,则会记录大量的日志,造成硬盘资源的大量占用。大量日志信息被写入硬盘,也会造成软件运行效率的低下。
11、另外,操作系统自身能够监控运行的软件状态,记录软件的错误信息。当在linux系统中开启core文件生成后,可以自动抓取软件的异常错误并生成core文件。该文件可以通过gdb命令进行解析,并生成可读的错误堆栈。但该操作需要用户手动查找core文件输出目录,找到对应的core文件,再输入gdb调试指令,对文件内容进行解析。此操作非常复杂,对用户操作要求很高。另外,操作系统重启或硬盘空间不够时,会自动删除core文件,造成错误日志的丢失。
12、google团队在软件故障定位中投入了很大的力量,开发了breakpad插桩监视模块,能够嵌入到软件代码工程中,自动插桩监控捕获错误信息,并生成dmp错误日志文件。但该方法也需要通过多个工具进行配合,输入复杂的指令,对dmp文件进行解析、转换,才能够获取可读的故障具体信息,一般需要专业人员人员才能完成。
技术实现思路
1、为解决现有的技术问题,本发明提供了一种基于qt多进程框架下的故障自动定位方法。
2、本发明的具体内容如下:一种基于qt多进程框架下的故障自动定位方法,包括breakpad插桩、事件队列监视和监视服务,在进程内,在进程基类中封装breakpad插桩监视和事件队列监视机制,完成进程内故障信息的监视和输出;在进程外,采用单独的监视服务,扫描进程内插桩输出的故障日志和操作系统捕获的故障日志,通过脚本自动解析故障日志中,生成可读堆栈信息。
3、进一步的,在框架内核中,对进程基类qapplication进行派生,在派生类sympapplication中集成插桩监视和事件队列监视机制,步骤包括:
4、步骤一,在类的构造函数中,调用breakpad初始化函数,设置输出日志文件路径和名称,创建breakpad回调函数,通过回调函数捕捉错误信息到指定文件;
5、步骤二,重写sympapplication的notify回调函数,在函数中添加try/catch异常捕获机制,记录异常事件的对象名、事件类型等信息,并记录到日志中,并返回true,阻止事件下行;
6、步骤三,使用派生类sympapplication替代框架进程执行程序基类qapplication,由sympapplication类完成框架进程内部插桩监视;
7、步骤四,将sympapplication集成到插件基类execativeplugin中,在插件基类的构造函数中创建sympapplication类对象,从而完成进程插件内部插桩监视。
8、进一步的,在框架进程启动时,启动监视服务,并将进程信息与监视服务进行同步,步骤包括:
9、步骤一,框架启动时创建共享内存,建立跨进程通信的机制;
10、步骤二,启动监视服务进程;
11、步骤三,收集将框架以及业务插件进程信息,打包写入共享内存;
12、步骤四,当框架中的进程发生变化后,重新将进程信息打包写入共享内存;
13、步骤五,关闭框架时,同时关闭监视服务。
14、进一步的,监视服务定时同步框架传送来的进程信息,并定时扫描各个进程的故障日志信息,对错误日志进行自动解析和显示,步骤包括:
15、步骤一,连接共享内存,读取共享内存中的进程信息到进程列表中;
16、步骤二,根据进程列表中的进程信息,获取对应的dmp文件和core文件目录,开启定时器,到对应的日志文件目录中进行扫描,获取对应进程新产生的日志文件;
17、步骤三,根据日志文件类型,组装命令脚本,通过脚本执行对文件进行解析,生成可阅读的堆栈信息;
18、步骤四,弹出界面,对堆栈文本进行可视化显示。
19、进一步的,步骤二定时扫描的过程包括:
20、dmp格式故障日志文件的扫描处理过程如下包括:
21、(1)获取dmp日志文件目录:根据框架中的插件组织结构,获取每个进程的dmp日志文件输出目录;
22、(2)扫描dmp文件:开启定时器,定时扫描每个dmp文件目录,获取目录中所有文件信息,包括文件名称、生成时间信息;
23、(3)信息比对:从日志文件名称中提取进程号,与当前进程号进行比对;获取日志文件生成时间,与当前计算机时间进行比对,若提取的进程号与当前进程的进程号相同,且文件生成时间与当前时间相差在阈值范围内,代表扫描到新的dmp文件,转入步骤三;
24、core格式故障日志文件的扫描处理过程包括:
25、(1)获取操作系统core文件输出参数:调用操作系统命令“cat/proc/sys/kernel/core_pattern”,获取操作系统core文件的输出目录和文件名格式;
26、(2)扫描core文件:开启定时器,定时扫描操作系统core文件目录,过滤core开头的文件,得到目录中所有的core文件;
27、(3)提取core文件信息:获取每个core文件的文件名,从文件名中提取对应的进程号;
28、(4)信息比对:将进程号与进程信息列表中进程号进行比对,若进程列表中包含该进程号,则代表该日志文件为由框架或某个插件进程产生,若文件生成时间与当前时间相差在阈值范围内,代表扫描到新的core文件,转入步骤三。
29、进一步的,步骤三对文件进行解析包括:
30、对于dmp格式日志文件,提取的信息包括模块调用关系和调用堆栈两种:
31、(1)模块调用关系解析:需利用breakpad中提供的工具,操作包括软件符号提取和调用关系文件生成两个步骤:
32、(11)软件符号提取:调用dump_syms工具,提取进程软件符号信息到temp.sym文件中;
33、(12)调用关系文件生成:调用minidump_stackwalk工具,并利用步骤(11)生成的temp.sym,解析dmp文件中的调用关系信息,并输出到文本文件中;
34、(2)调用堆栈解析:需要breakpad工具和gdb工具配合完成,首先需使用breakpad工具将文件转换为core格式文件,再调用gdb调试命令,解析出可读堆栈信息,具体操作过程如下:
35、(21)格式转换:调用minidump-2-core工具,将dmp格式转换为core格式,输出到cortemp文件中;
36、(22)堆栈解析:调用gdb调试命令,从转换后的core文件中提取当前错误堆栈及函数信息;
37、对于core格式日志文件,直接调用gdb命令对调用堆栈进行解析。
38、进一步的,步骤四中,对同一个进程不同日志文件解析结果在同一个界面中进行显示。
39、进一步的,监视服务中定时连接共享内存,若共享内存连接不成功,监视服务需继续运行一段时间,扫描是否有框架的故障日志产生,若未扫描到新的故障日志,则自行退出。
40、本发明结合多进程应用集成框架的特点,在框架平台层对故障监视定位功能进行封装,对框架及业务插件进程进行统一监控,通过插桩监视和外部监视两种手段,从进程内和进程外两个层面,对对进程软件故障信息进行监视和定位,实现软件运行过程中错误信息的及时抓取,完成错误信息的自动解析与实时显示。
1.一种基于qt多进程框架下的故障自动定位方法,其特征在于:包括breakpad插桩、事件队列监视和监视服务,在进程内,在进程基类中封装breakpad插桩监视和事件队列监视机制,完成进程内故障信息的监视和输出;在进程外,采用单独的监视服务,扫描进程内插桩输出的故障日志和操作系统捕获的故障日志,通过脚本自动解析故障日志中,生成可读堆栈信息。
2.根据权利要求1所述的基于qt多进程框架下的故障自动定位方法,其特征在于:在框架内核中,对进程基类qapplication进行派生,在派生类sympapplication中集成插桩监视和事件队列监视机制,步骤包括:
3.根据权利要求1所述的基于qt多进程框架下的故障自动定位方法,其特征在于:在框架进程启动时,启动监视服务,并将进程信息与监视服务进行同步,步骤包括:
4.根据权利要求1所述的基于qt多进程框架下的故障自动定位方法,其特征在于:监视服务定时同步框架传送来的进程信息,并定时扫描各个进程的故障日志信息,对错误日志进行自动解析和显示,步骤包括:
5.根据权利要求4所述的基于qt多进程框架下的故障自动定位方法,其特征在于:步骤二定时扫描的过程包括:
6.根据权利要求4所述的基于qt多进程框架下的故障自动定位方法,其特征在于:步骤三对文件进行解析包括:
7.根据权利要求4所述的基于qt多进程框架下的故障自动定位方法,其特征在于:步骤四中,对同一个进程不同日志文件解析结果在同一个界面中进行显示。
8.根据权利要求4所述的基于qt多进程框架下的故障自动定位方法,其特征在于:监视服务中定时连接共享内存,若共享内存连接不成功,监视服务需继续运行一段时间,扫描是否有框架的故障日志产生,若未扫描到新的故障日志,则自行退出。