一种嵌入式仪器软件的故障定位及分析方法
技术领域
本发明属于嵌入式仪器软件的故障定位技术领域,尤其涉及的是一种嵌入式仪器软件的故障定位及分析方法。
背景技术
仪器软件尤其是大型仪器软件,很难避免错误或Bug产生,当仪器给用户使用或实际测试时,仪器软件需要脱离软件开发环境和源代码,因而无法用调试软件来分析和定位仪器软件的Bug,而软件Bug是无法根除或避免的问题,产生了软件错误,如何让开发人员迅速找到产生Bug的地方,并分析软件程序产生错误的原因,从而迅速升级改正错误至关重要。而且当仪器在外地用户使用时产生了错误,这时候如何让开发人员知悉错误现象,或复现错误现象,对于分析查找软件程序产生错误的原因是必须的。目前当仪器软件出现错误时候,都是用户通过描述错误的现象或提示,通知仪器开发人员,开发人员进而通过用户描述努力复现错误现象。
传统的仪器软件发生故障或错误后都是通过用户描述或照相截屏的方式告知仪器软件的开发人员,开发人员很难知晓仪器软件产生的具体原因。
因此,现有技术存在缺陷,需要改进。
发明内容
本发明所要解决的技术问题是针对现有技术的不足,提供一种嵌入式仪器软件的故障定位及分析方法。
本发明的技术方案如下:
一种嵌入式仪器软件的故障定位及分析方法,其中,包括以下步骤:
步骤1:函数执行信息宏指令存储函数处理;
步骤2:后台存储线程处理;
步骤3:函数执行信息存储文件内容及格式处理;
步骤4:函数执行信息分析处理。
所述的方法,其中,所述步骤1的具体步骤为:将宏指令存储函数分为二种数据进行处理;第一种数据设置为入口第一条程序前调用,用于把调用函数的函数名称、调用时刻以及所有入口参数,发送到后台线程队列中;第二种数据在每个仪器的函数返回指令前或最后一条语句后,把函数名称、返回时刻以及所有入口参数值,函数返回值,发送到后台线程队列中。
所述的方法,其中,所述宏指令存储函数为变参函数,用于将所有类型参数统一强制转换为无意义的以字节为单位的二进制数。
所述的方法,其中,所述步骤2的具体步骤为:在仪器软件程序中建立一个后台线程,用于将宏指令函数发送的状态参数按时间顺序及预定格式存储到硬盘文件中。
所述的方法,其中,存储的原则是:首先设定文件大小,当存储信息超过该设定大小时,则循环使用设定的硬盘存储空间,丢弃存储时间在前的数据存储存储时间在后的数据。
所述的方法,其中,所述步骤3中,所述预定格式定义:d表示32位整数;f表示32位浮点数;e表示64位浮点数;s表示字符串;c表示字符;z表示自定义结构;def参数表示函数的入口参数为3个分别为32位整数,64位浮点数,32位浮点数。
所述的方法,其中,所述步骤4中,通过分析查看函数执行信息存储文件,将接收函数与预设函数进行比对,通过对入口参数和返回参数进行仿真运算,通过接收函数确定故障位置。
所述的方法,其中,所述接收函数确定故障位置的具体步骤为:在存储硬盘文件查找最后一个函数且函数的名字和当时调用的函数参数都在源代码中代入,再进行验证;或通过获知线程中函数的执行序列,以及这些函数总的执行时间,从而获得所有线程的执行时间比例。
采用上述方案,应用于嵌入式仪器软件中,使仪器软件开发人员迅速定位产生软件Bug的地方,并复现故障现象,进而分析软件程序产生错误的原因,仿真故障结果,从而迅速改进仪器软件。也可以使软件开发人员通过网络等手段远程分析仪器软件故障原因,指导用户排除故障,提高仪器的使用和维护效率。并且实现成本低廉,具有无可比拟的优势。
附图说明
图1为本发明的结构示意图。
具体实施方式
以下结合附图和具体实施例,对本发明进行详细说明。
实施例1
仪器软件内部从主函数开始执行,主函数调用各种软件功能函数,每种软件功能函数又再调用其它各种函数库函数以及操作系统应用函数。函数库函数以及操作系统应用函数是经过充分验证测试的,相对于仪器软件出现错误的可能性非常小,可以忽略。因此对于用户函数尤其是复杂功能的用户函数出现Bug的可能性相比较而言就比较大些。该发明分四部分实现,包括,函数执行信息宏指令存储函数,后台存储线程部分,函数执行信息存储文件内容及格式,函数执行信息分析部分,具体实现见图1。
函数执行信息宏指令存储函数:
宏指令存储函数包括MacroSaveFront(…)和MacroSaveRear(…),MacroSaveFront(…)该函数功能是在每个仪器的函数入口第一条程序前调用,用于把调用函数的函数名称、调用时刻以及所有入口参数,发送到后台线程队列中;另一个宏指令存储函数MacroSaveRear(…)功能是在每个仪器的函数返回指令前或最后一条语句后,把函数名称、返回时刻以及所有入口参数值,函数返回值,发送到后台线程队列中。
宏指令存储函数设计为变参函数,即参数的个数可以灵活多个,所有类型参数统一强制转换为无意义的以字节为单位的二进制数。
后台存储线程部分:
在仪器软件中建立一个后台线程,该线程用于将这两个宏指令函数发送的状态参数按时间顺序,并以下面的格式(见表1.)保存到硬盘文件中,由于硬盘空间有限,存储的原则是首先设定文件大小,当存储信息超过该设定大小时,则循环使用设定的硬盘存储空间,丢弃老的存储新的。下表1为后台线程存储状态文件的内容及格式:
调用时刻通过获取计算机多媒体时钟得到,可以精确到微妙以上。
以文本表示的参数串格式,如”d”表示32位整数,”f”表示32位浮点数,“e”表示64位浮点,“s”表示字符串,“c”表示字符,”z“表示自定义结构等。如果文件中该处为”def’参数则表示函数的入口参数为3个分别为32位整数,64位浮点数,32位浮点数。
仪器程序中,复杂功能函数或用户认为出现Bug可能性比较大的函数,都加入上述宏存储指令。
函数名(编号),入口参数,返回参数,进入函数和退出函数的时刻,当进入每个函数时候都把函数名和入口参数存入分析队列,函数要返回时候存入入口参数和返回参数,因为入口参数如果是采用了引用或指针的情况,入口参数会携带函数返回信息。
通过分析查看函数执行信息存储文件,可以很快定位到哪个函数出现问题,并可以对入口参数和返回参数进行仿真运算,以确定该函数内部哪些代码有缺陷。
函数执行信息分析:
可以通过通用编辑软件打开函数执行信息的后台存储文件,进行人工分析,也可以通过编制分析软件统计函数执行信息,并以图或表的形式展现函数调用及执行信息流程或故障分析。
当仪器软件出现非用户设定的提示“访问非法错误“,不能继续执行时候,由于软件是二进制状态,这时候即便出现该错误,软件开发人员也很难定位到错误产生的具体哪个函数,仪器软件应用上面的方法后,只需要从后台存储硬盘文件查找最后一个函数,就知道源程序中哪个函数出现当机错误了,且函数的名字和当时调用的函数参数都可以在源代码中代入,从而再具体验证函数中哪行代码导致了该错误的发生。
当仪器软件出现用户设定的错误提示时,无法解决时,用户可以把后台存储的硬盘文件,通过网络等手段发送给软件开发人员,软件开发人员也可以复现错误故障提示,从而进一步确定源代码中哪个函数的哪段程序导致错误产生。
通过后台存储线程的状态文件,软件开发人员,可以知道某些线程中函数的执行序列,以及这些函数总的执行时间,从而可以获得所有线程的执行时间比例,进而调整线程优先级提高仪器软件的执行效率。
用户也可以通过网络等手段查看函数执行信息文件,当仪器在用户使用时出现故障后,仪器开发人员可以通过互联网查看判定软件执行时候具体上下文信息,以断定故障程序代码和复现故障现象,指导用户排除故障,从而提高仪器的维护和使用效率。
在某型号微波频谱分析仪中,软件操作系统采用了嵌入式Windows XP,为便于开发人员发现软件错误,复现错误现象,分析软件脱离调试环境后各线程执行效率,应用了本发明。仪器软件中主程序启动后又建立了4个线程,每个线程独立运行,中间通过事件机制同步,每个线程又调用了很多的仪器功能函数。为实现本发明,主程序建立一个后台存储线程BackSaveThread()用于存储所有函数的中间执行状态信息。建立两个宏指令存储函数MacroSaveFront()和MacroSaveRear()用于向后台存储线程传递信息,信息格式参见表1。
以测量线程中调用的一个频谱分析仪接收通道设置函数为例,该函数的实现形式如下:
调用如下:
仪器软件执行后,该函数信息存储文件如下:
通过分析函数执行信息文件,可以知道函数SetSignalPath正常进入和退出,执行时间为1454550-1424536=14us,函数入口为“double eFreq,int nAtten”分别是101.5和20返回时候入口参数和出口参数“double eFreq,int nAtten int x”101.5,10和20,通过分析函数执行信息文件可以看出:函数正常执行并返回,经历时间14us,如果以后统计到函数执行时间比较长的话,可能函数内部涉及到硬件操作的部分,速率有所降低,可能总线操作缓慢产生等待,可以推测是硬件故障,如果函数的返回参数为0的情况下,可能执行异常。这时候开发人员就可以根据具体情况判断软件或硬件故障,并根据入口参数,进一步仿真验证是否是程序设计缺陷。
如果执行完该函数后仪器硬件电路设置不正常,可以通过函数执行信息文件查看入口参数等信息,进一步验算是否是软件故障。
通过线程入口函数,线程最后一个函数,可以计算线程的执行时间,执行频率等,进一步优化仪器软件中的线程优先级,提高仪器软件效率。
实施例2
在上述实施例的基础上,对本发明进一步说明,一种嵌入式仪器软件的故障定位及分析方法,其中,包括以下步骤:
步骤1:函数执行信息宏指令存储函数处理;
步骤2:后台存储线程处理;
步骤3:函数执行信息存储文件内容及格式处理;
步骤4:函数执行信息分析处理。
所述步骤1的具体步骤为:将宏指令存储函数分为二种数据进行处理;第一种数据设置为入口第一条程序前调用,用于把调用函数的函数名称、调用时刻以及所有入口参数,发送到后台线程队列中;第二种数据在每个仪器的函数返回指令前或最后一条语句后,把函数名称、返回时刻以及所有入口参数值,函数返回值,发送到后台线程队列中。所述宏指令存储函数为变参函数,用于将所有类型参数统一强制转换为无意义的以字节为单位的二进制数。
所述步骤2的具体步骤为:在仪器软件程序中建立一个后台线程,用于将宏指令函数发送的状态参数按时间顺序及预定格式存储到硬盘文件中。存储的原则是:首先设定文件大小,当存储信息超过该设定大小时,则循环使用设定的硬盘存储空间,丢弃存储时间在前的数据存储存储时间在后的数据。
所述步骤3中,所述预定格式定义:d表示32位整数;f表示32位浮点数;e表示64位浮点数;s表示字符串;c表示字符;z表示自定义结构;def参数表示函数的入口参数为3个分别为32位整数,64位浮点数,32位浮点数。
所述步骤4中,通过分析查看函数执行信息存储文件,将接收函数与预设函数进行比对,通过对入口参数和返回参数进行仿真运算,通过接收函数确定故障位置。所述接收函数确定故障位置的具体步骤为:在存储硬盘文件查找最后一个函数且函数的名字和当时调用的函数参数都在源代码中代入,再进行验证;或通过获知线程中函数的执行序列,以及这些函数总的执行时间,从而获得所有线程的执行时间比例。
采用上述方案,应用于嵌入式仪器软件中,使仪器软件开发人员迅速定位产生软件Bug的地方,并复现故障现象,进而分析软件程序产生错误的原因,仿真故障结果,从而迅速改进仪器软件。也可以使软件开发人员通过网络等手段远程分析仪器软件故障原因,指导用户排除故障,提高仪器的使用和维护效率。并且实现成本低廉,具有无可比拟的优势。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。