定位程序异常的方法技术

技术编号:2857422 阅读:253 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种定位程序异常的方法,包括下述步骤:1)生成第一可执行文件以及代码信息文件;2)在所述第一可执行文件中加载所述代码信息文件,生成含有代码信息文件信息块的第二可执行文件;3)启动所述第二可执行文件,加载异常捕获与定位动态库;4)当第二可执行文件发生异常时,产生系统核心数据,所述系统核心数据包含函数调用的内存地址;5)从所述第二可执行文件读取代码信息文件,比较前述系统核心数据和代码信息文件,确定程序异常的位置。应用本发明专利技术提供的定位程序异常的方法可以高效、便捷、准确地对发生异常的程序进行自动定位,并提供充足信息供程序维护人员查找异常原因。

【技术实现步骤摘要】

本专利技术涉及数据处理领域,特别是涉及一种当程序出现异常时,对程序的异常进行准确定位的方法。
技术介绍
随着计算机的日益普及和快速发展,人们不仅在工作和生活中越来越多地依赖于各种各样的程序,而且对程序的功能提出越来越高的要求。伴随着功能的提高与加强,程序的复杂度也随之增加,由此导致程序的稳定性和可靠性下降,使得程序在运行过程中会出现各种异常状况。为了跟踪、查找程序发生异常的确切位置,人们开发了多种捕获程序异常和。目前,较为流行的大都采用二次分析的方法。首先,由维护人员分别保存编译过程中产生的可执行文件和被跟踪程序对应的程序符号库。所述程序符号库含有程序代码和符号信息。然后,由维护人员事先进行捕获程序异常的设置,选定被跟踪程序。当被跟踪程序出现异常时,首先生成异常发生的内存地址、异常发生的模块信息和函数调用栈等系统核心数据;然后由维护人员将程序符号库导入内存,在内存中比较、分析所述系统核心数据与程序符号库,并确定程序发生异常的位置;最终生成含有上述位置信息的异常代码定位文件。实际使用中,常采用的程序符号库为含有程序调试信息的pdb(programdatabase,程序数据库)文件。再者,所述系统核心数据的具体表现形式和格式因所采用的捕获程序异常和定位程序异常的工具和方法的不同而不同。目前,Windows操作系统下较为常用的是采用Userdump工具和WinDebug工具来实现对程序发生的异常进行定位。首先,维护人员使用Userdump工具选定被跟踪程序,设置需要跟踪的异常种类;保存程序编译过程中生成的pdb文件。然后,维护人员启动被跟踪程序,Userdump工具在被跟踪程序上注册异常捕获钩子,用于捕获被跟踪程序发生的异常。被跟踪程序运行过程中,Userdump工具始终驻留在内存中,一旦被跟踪程序发生异常,立即捕获异常并记录系统核心数据文件。所述系统核心数据可以是dump文件。然后,维护人员利用WinDebug工具导入dump文件和pdb文件,由WinDebug工具判断dump文件中记录的发生异常的内存地址是否在pdb文件中。然后,根据dump文件对应的函数调用栈中的函数从pdb文件中分析出异常函数的函数名,并根据发生异常的内存地址计算异常发生在第几行代码。最后,生成异常代码定位报告。所述异常代码定位报告包括发生异常的代码位置、发生异常的代码的模块名(例如kernel32.dll)、文件名、函数调用栈、函数名等信息。尽管,现有技术提供的定位程序异常的工具和方法可以实现对程序异常的跟踪与定位,但是在实际应用中仍然不可避免地存在下述缺陷其一,采用现有技术提供的,需要由维护人员单独保存程序编译过程中生成的程序符号库。当程序出现异常时,维护人员取出程序符号库文件,并利用异常定位工具将其导入,然后由异常定位工具比较系统核心数据和程序符号库,最终生成异常代码定位文件。因而采用现有技术中提供的不能自动地对程序发生的异常进行定位。同时,由于人工的介入,导致人力资源浪费,并使得定位分析时间较长、工作效率较低。其二,现有技术提供的方法和工具需要由维护人员将程序编译过程中生成的各个pdb文件,以及生成的pdb文件的程序代码作为各个分立的文件分别保存。由于系统核心数据对应于被跟踪程序,而被跟踪程序重新编译将重新生成pdb文件。因此,只有程序代码和相应的pdb文件版本保持一致,才能通过系统核心数据与pdb文件判断出程序出现异常的确切位置。也就是,若程序代码出现更改,必须重新生成pdb文件并与相同版本的程序代码一同保存。然而,若由人工或采用简单的版本管理机制来分别保存程序代码和相应的pdb文件,将难以保证两者的版本绝对一致,尤其是对于含有多个动态库组件的程序。因此,在查找程序发生异常的确切位置时,很难找到与发生异常的程序代码对应的pdb文件,也就难以确定程序发生异常的确切位置。为此,必须使用一套高级的版本管理机制,来保持pdb文件版本与程序代码版本之间的对应关系。但是,若自行开发完善的版本管理机制将加大程序开发的成本,同时增加开发的技术难度;若直接采用现有的高级版本管理机制,由于高级版本管理机制的价格较高,同样会导致成本的提高。其三,现有技术中经常借助Userdump工具来判断程序是否有异常发生。而Userdump工具需要安装在用户侧的计算机上,并且需要在启动被跟踪程序之前进行参数设定,通常用户无法自行完成设定,需要由Userdump工具供应商提供相应的服务,因而使用Userdump等工具的成本较高。其四,一旦被跟踪的程序启动,Userdump工具始终驻留在内存中等待被跟踪程序发生异常,而不会自行退出内存。因此在被跟踪程序运行过程中,Userdump工具始终占用内存资源。
技术实现思路
本专利技术解决的技术问题在于提供了一种,能够无需单独保存代码信息文件就可自动地对程序发生的异常进行定位。为此,本专利技术解决技术问题的技术方案是提供一种,包括步骤1)成第一可执行文件以及代码信息文件;2)在所述第一可执行文件中加载所述代码信息文件,生成含有代码信息文件信息块的第二可执行文件;3)启动所述第二可执行文件,加载异常捕获与定位动态库;4)当第二可执行文件发生异常时,产生系统核心数据,所述系统核心数据包含函数调用的内存地址;5)从所述第二可执行文件读取代码信息文件,比较前述系统核心数据和代码信息文件,确定程序异常的位置。所述第二可执行文件包括第一可执行文件、代码信息文件、分割符和第一可执行文件长度数据;所述分割符位于所述第一可执行文件和所述代码信息文件之间、相邻的两个代码信息文件之间,以及代码信息文件和第一可执行文件长度之间,用于分割第一可执行文件、各个代码信息文件以及第一可执行文件长度。所述步骤1)具体包括在程序编译单元中设置加载单元,并通过程序编译单元生成第一可执行文件以及代码信息文件;在所述步骤2)中,通过加载单元将代码信息文件添加至第一可执行文件。所述步骤3)中加载异常捕获与定位动态库的过程包括将异常捕获钩子添加到第二可执行文件中,用于捕获异常;将异常代码定位单元嵌入第二可执行文件中,用于生成异常代码定位文件。所述步骤3)中异常捕获钩子添加到第二可执行文件中的异常捕获链表中。所述步骤5)具体包括步骤41)生成异常代码定位文件的文件名;42)将系统核心数据写入异常代码定位文件;43)读取第二可执行文件中的代码信息文件信息块;44)比较系统核心数据和代码信息文件,确定程序异常对应的文件名、函数名和代码行。所述步骤43)具体包括从第二可执行文件中分离出各个代码信息文件,并依据内存映射格式将代码信息文件读入内存。所述代码信息文件是MAP文件。所述MAP文件在内存中以MAP文件信息列表类格式存放。所述MAP文件信息列表类对应MAP文件信息类以及文件名和代码行类;所述文件名和代码行类存放文件名和代码行;所述MAP文件信息类存放MAP文件模块名、模块代码加载起始地址、模块代码加载终止地址、文件名和代码行对应表以及函数名对应表;所述文件名和代码行对应表存放读取MAP文件时生成的文件名和代码行的哈希值;所述函数名对应表存放读取MAP文件时生成的函数名的哈希值,键值为函数地址。所述步骤44)中进一步包括通过比较函数调用的内存地址与所述模块代码加载起始地本文档来自技高网
...

【技术保护点】
一种定位程序异常的方法,其特征在于包括步骤:1)生成第一可执行文件以及代码信息文件;2)在所述第一可执行文件中加载所述代码信息文件,生成含有代码信息文件信息块的第二可执行文件;3)启动所述第二可执行文件,加载异常捕获 与定位动态库;4)当第二可执行文件发生异常时,产生系统核心数据,所述系统核心数据包含函数调用的内存地址;5)从所述第二可执行文件读取代码信息文件,比较前述系统核心数据和代码信息文件,确定程序异常的位置。

【技术特征摘要】

【专利技术属性】
技术研发人员:陈远翔
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:94[中国|深圳]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1