CN110321275A - 程序监控方法、装置、计算设备以及存储介质 - Google Patents
程序监控方法、装置、计算设备以及存储介质 Download PDFInfo
- Publication number
- CN110321275A CN110321275A CN201810271607.1A CN201810271607A CN110321275A CN 110321275 A CN110321275 A CN 110321275A CN 201810271607 A CN201810271607 A CN 201810271607A CN 110321275 A CN110321275 A CN 110321275A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- monitoring
- capture
- module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请提供了一种程序监控方法,所述方法包括:获取被测程序的源代码;当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序;当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
Description
技术领域
本申请涉及信息技术领域,尤其涉及一种程序监控方法、装置、计算设备以及存储介质。
背景技术
随着信息网络技术的发展,在终端设备上安装各种各样的程序来满足用户的众多需求,如、娱乐需求、办公需求等,然而由于相关人员在设计程序时并不能尽善尽美,所以程序或多或少都会出现问题,给用户带来不好的使用体验,所以,相关人员需要花费大量时间来测试程序中可能存在的问题并尽快解决这些问题,来避免给用户带来不好的使用体验,所以相关人员如何能够快捷地查找出程序可能存在的问题是解决该问题的关键。
发明内容
本申请提出了以下技术方案,能够高效地查找出程序可能存在的问题。
本申请实例提出了一种程序监控方法,所述方法包括:获取被测程序的源代码;当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序;及当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
在一些实例中,所述获取被测程序的源代码包括:从反编译模块获取所述源代码,所述源代码为所述反编译模块对所述被测程序的原可执行程序进行反编译处理得到。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置,包括:当所述该函数不存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在所述函数的结束位置后。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的第二代码的位置,包括:当所述该函数存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在处理所述返回值的位置前。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述方法进一步包括:当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在捕获代码时,则执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述方法进一步包括:当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,在所述第一代码中添加所述捕获代码;在添加完所述捕获代码后,执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,则所述第一代码包括监测代码以及与所述监测代码对应的处理代码;其中,所述在所述第一代码中添加所述捕获代码,包括:存储所述处理代码,在存储所述处理代码后删除所述处理代码;在未删除前所述处理代码的位置上添加所述捕获代码;及在所述捕获代码后添加存储的所述处理代码。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述方法进一步包括:当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码;当确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码,则执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及所述当所述可执行程序在运行模块中运行时,将所述捕获代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将添加的所述捕获代码捕获到的异常信息发送至日志监控模块;其中,所述方法进一步包括:根据所述监测代码执行所述函数的代码,当所述监测机代码监测到该函数的代码中的异常信息时,将所述异常信息输入至所述捕获代码中,以使所述捕获代码获取到所述函数的异常信息。
在一些实例中,所述方法进一步包括:当根据添加的捕获代码,将获取到异常信息抛出,以使得该异常信息被所述函数对应的异常处理代码所处理。
在一些实例中,所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码,包括:当查找到与所述捕获代码对应的监测代码的起始地址相同的其他监测代码的起始地址时,则确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码。
在一些实例中,所述方法进一步包括:在所述源代码中的任一个函数中引用日志监控函数;其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:通过引用所述日志监控函数,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块。
本申请实例提出了一种程序监控方法,应用于监控系统,所述方法包括:获取被测程序的源代码;当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;对经过上述处理的所述源代码进行编译,得到待测试的可执行程序;运行所述待测试的可执行程序;记录所述用于异常处理的代码捕获到的异常信息;及将所述异常信息发送至用于接收异常信息的客户端。
在一些实例中,所述方法进一步包括:在源代码中的任一个函数中引用日志监控函数;其中,所述记录所述用于异常处理的代码捕获到的异常信息,包括:通过引用所述日志监控函数,输出所述用于异常处理的代码捕获到的异常信息至日志文件中;其中,所述方法进一步包括:去除重复的所述日志文件;确定所述日志文件中的每个所述异常信息以及其发生的次数;其中,将所述异常信息发送至用于解决异常的客户端,包括:将所述异常信息以及其发生的次数发送至用于解决异常的客户端。
本申请实例还提出了一种程序监控装置,所述装置包括:获取模块,获取被测程序的源代码;确定模块,当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;提供模块,将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序;及发送模块,当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
在一些实例中,所述获取模块,从反编译模块获取所述源代码,所述源代码为所述反编译模块对所述被测程序的原可执行程序进行反编译处理得到。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,确定模块,当所述该函数不存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在所述函数的结束位置后。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,确定模块,当所述该函数存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在处理所述返回值的位置前。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,确定模块,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在捕获代码时,则使提供模块执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及使发送模块执行所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,所述发送模块,将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述装置进一步包括:添加模块,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,在所述第一代码中添加所述捕获代码;在添加完所述捕获代码后,使提供模块执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及使发送模块执行所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,发送模块,将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,则所述第一代码包括监测代码以及与所述监测代码对应的处理代码;其中,所述添加模块,包括:存储单元,存储所述处理代码,在存储所述处理代码后删除所述处理代码;第一添加单元,在未删除前所述处理代码的位置上添加所述捕获代码;第二添加单元,在所述捕获代码后添加存储的所述处理代码。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述确定模块,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码;当确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码,则使提供模块执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及使发送模块执行所述当所述可执行程序在运行模块中运行时,将所述捕获代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,发送模块,将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,所述发送模块,将添加的所述捕获代码捕获到的异常信息发送至日志监控模块;其中,所述装置进一步包括:输入模块,根据所述监测代码执行所述函数的代码,当所述监测机代码监测到该函数的代码中的异常信息时,将所述异常信息输入至所述捕获代码中,以使所述捕获代码获取到所述函数的异常信息。
在一些实例中,所述装置进一步包括:抛出模块,当根据添加的捕获代码,将获取到异常信息抛出,以使得该异常信息被所述函数对应的异常处理代码所处理。
在一些实例中,所述确定模块,当查找到与所述捕获代码对应的监测代码的起始地址相同的其他监测代码的起始地址时,则确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码。
在一些实例中,所述装置进一步包括:引用模块,在所述源代码中的任一个函数中引用日志监控函数;其中,发送模块,通过引用所述日志监控函数,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块。
本申请实例还提出了一种程序监控系统,所述系统包括:获取模块,获取被测程序的源代码;确定模块,当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;编译模块,对经过上述处理的所述源代码进行编译,得到待测试的可执行程序;测试模块,运行所述待测试的可执行程序;记录模块,记录所述用于异常处理的代码捕获到的异常信息;发送模块,将所述异常信息发送至用于接收异常信息的客户端。
在一些实例中,所述系统进一步包括:引用模块,在源代码中的任一个函数中引用日志监控函数;其中,所述记录模块,通过引用所述日志监控函数,输出所述用于异常处理的代码捕获到的异常信息至日志文件中;其中,所述系统进一步包括:去重模块,去除重复的所述日志文件;所述确定模块,确定所述日志文件中的每个所述异常信息以及其发生的次数;其中,发送模块,将所述异常信息以及其发生的次数发送至用于解决异常的客户端。
本申请实例还提出了一种计算设备,包括存储器、处理器以及存储在所述存储器上并在所述处理器上运行的计算机程序;所述处理器执行所述计算机程序时实现上述的方法。
本申请实例还提出了一种存储介质,存储有一个或多个程序,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行上述的方法。
应用本发明的技术方案,可以快速地且方便地捕获被测程序在进行测试时发生的异常信息,并将通过对该异常信息的记录,减少相关人员,特别是,测试人员的测试时间,节省测试人员的人力成本,同时减少因为相关人员因素而造成的程序异常信息未被发现的情况发生。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请一个实例的程序监控方法适用的系统结构示意图;
图2为本申请一个实例的程序监控方法的流程图;
图3为本申请一个实例的程序监控方法的交互流程图;
图4为本申请一个实例中的处理源代码中任一个函数的流程图;
图5为本申请一个实例的程序监控方法的流程图;
图6为本申请一个实例的程序监控装置的结构示意图;
图7为本申请一个实例的程序监控装置的结构示意图;
图8为本申请一个实例的计算设备的硬件的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了描述上的简洁和直观,下文通过描述若干代表性的实施例来对本发明的方案进行阐述。实施例中大量的细节仅用于帮助理解本发明的方案。但是很明显,本发明的技术方案实现时可以不局限于这些细节。为了避免不必要地模糊了本发明的方案,一些实施方式没有进行细致地描述,而是仅给出了框架。下文中,“包括”是指“包括但不限于”,“根据……”是指“至少根据……,但不限于仅根据……”。下文中没有特别指出一个成分的数量时,意味着该成分可以是一个也可以是多个,或可理解为至少一个。
图1示出了本申请实例的程序运行方法适用的系统100结构示意图。该系统100可以包括终端设备101、服务器102、网络103以及终端设备104。
其中,终端设备101是指具有数据计算处理功能的设备,包括但不限于(安装有通信模块的)智能电脑等。终端设备101上安装有操作系统,包括但不限于:Windows操作系统、Linux操作系统以及苹果mac OS操作系统等等。
其中,终端设备101可以安装有第一客户端(如,编译PC客户端),该第一客户端根据程序人员的指令可以对被测程序的源代码进行修改,然后对修改后的源代码进行编译,来实现新功能或解决该被测程序出现的异常问题,还可以创建一段新的被测程序的源代码,并对其进行编译等等,当被测程序编译成功后,第一客户端会将该编译后的被测程序通过网络103提交到服务器102中,其中,第一客户端在对被测程序的源代码进行修改或创建的时候可以在该被测程序的源代码中注入用于异常处理的代码(如,该被测程序的第一函数中注入用于异常处理的代码,且该第一函数注入用于异常处理的代码的前提条件是,该第一函数不具有用于异常处理的代码),以保证该被测程序在进行测试的时候能够捕获其发送的异常信息。
服务器102可以安装有生成可执行程序的服务器软件,当服务器102接收到第一客户端发送的编译程序后,对其进行汇编,最终生成可执行程序,并对该可执行程序进行签名,得到可执行程序的安装包,如,APK(Android Package)安装包,将该安装包通过网络103进行下发至测试终端设备,以使得测试人员能够通过测试终端设备对该安装包中的程序进行测试。
需要说明的是,可执行程序通常都是由多个程序人员进行编译的,一个程序人员可以负责该可执行程序中的部分源代码编译工作,从而组成一个完整的应可执行程序的源代码。
终端设备103是指具有数据计算处理功能的设备,包括但不限于(安装有通信模块的)智能手机、掌上电脑、平板电脑等。终端设备101上安装有操作系统,包括但不限于:Android操作系统、Symbian操作系统、Windows mobile操作系统、Windows操作系统以及苹果iPhone OS操作系统等等。
其中,终端设备103,即测试终端设备,可以通过网络103接收服务器102下发的待测试可执行程序(如,视频APK),并对该待测试可执行程序进行安装,在安装后对该待测试可执行程序进行运行,从而来测试该可执行程序是否存在异常,当该可执行程序发生异常时,该可执行程序可以对该异常信息进行捕获。该可执行程序将捕获到的异常信息通过异常日志来记录,并对该异常日志进行分析和统计,得到有效的异常信息,并可以将该有效的异常信息通过网络103发送至终端设备101,该终端设备101还可以安装有用于第二客户端,该第二客户端用于接收终端设备103发送的异常信息,使得程序人员可以通过该第二客户端知晓被测程序中存在的异常,并对该被测程序的源代码进行修改,克服这些异常,从而通过上述执行过程完成该版本的被测程序的开发或升级等过程。
网络105可以是有线网络,也可以是无线网络。
基于系统100,本申请的实例提出了一种程序监控方法,应用于在被测程序中异常监控模块。以下结合图2和图3对本申请一实例进行说明,如图2所示,该方法200包括以下步骤:
需要说明的是,在实例中涉及到的异常监控模块、反编译模块、编译模块、运行模块、日志监控模块、日志分析模块等均可以视为是按照逻辑进行划分的模块,且上述这些模块在按照物理划分上来说,可以设置在同一个独立的硬件设备中,如,终端设备或服务器,也可以设置不同的独立的硬件设备中。
步骤201:获取被测程序的源代码。
在一些实例中,所述获取被测程序的源代码的方式可以包括但不限于:从反编译模块获取所述源代码,所述源代码为所述反编译模块对所述被测程序的原可执行程序进行反编译处理得到。
其中,上述反编译模块可以为反编译器。
例如,在终端设备101中的第一客户端上可以配置反编译器,程序人员执行该反编译器对待修改的目标文件(即原可执行程序)进行反编译,第一客户端可以在反编译目录中找到Assembly-CSharp.dll文件,这个文件可以为游戏主要代码逻辑文件,读取游戏逻辑代码程序集;第一客户端通过读取的方式获取到反编译后的源代码,使得异常监控模块读取到该源代码,即步骤301:异常监控模块获取被测程序的源代码。
其中,上述读取方式的语句可以为:
AssemblyDefinition assembiy=AssemblyDefinition.ReadAssembly(filename)
需要说明的是,若当前终端设备101中已经存储有该被测程序的源代码,则异常监控模块可以直接通过第一客户端查找到该源代码,异常监控模块读取查找到的该源代码,无需再通过反编译模块去获取。
本实例中的源代码可以以c#脚本语言为例,c#脚本语言是遵循CLI规范的高级语言,先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行程序的时候,这些IL会被加载到运行时库,也就是虚拟机中,由虚拟机动态的编译成汇编代码(JIT)然后在执行。
其中,IL的全称是Intermediate Language即中间语言,其目标语言为.NET框架的语言,其先被编译成CIL语言,然后再编译成字节码。
步骤202:当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码。
其中,上述任一个函数不存在对应的用于异常处理的代码包括:catch块代码或finally块代码。
上述添加该函数对应的用于异常处理的代码为:try-catch块代码。
上述返回值类型包括void类型和非void类型,其中,void类型表示为所属函数无返回值;非void类型表示为所属函数有返回值。
为了方便说明,以下实例中可简称“任一个函数不存在对应的用于异常处理的代码”为“第一代码”;“添加该函数对应的用于异常处理的代码”为“第二代码”。
其中,第二代码包括监测代码(即try块代码)和设置在所述监测代码后的捕获代码(即catch块代码),其中所述监测代码用于监测所述函数(即函数代码)的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息。
例如,根据前文所述,try-catch块代码设置形式可以如下:
当该函数在运行时发生异常,try块代码会抛出一个异常对象,并且赋值给语句catch块中的变量,使得catch块捕获到该异常信息,并将该异常信息通过日志监控函数发送至日志监控模块。
需要说明的是,当被测程序中的函数发生异常时,且try块监测到该异常发生时,该被测程序中的函数将不再继续执行出现在异常下边的代码,而直接跳转到try-catch块代码,并执行该try-catch块代码。
在一些实例中,步骤303:根据该函数的返回值类型,确定添加该函数对应的用于异常处理的第二代码的位置,包括:当所述该函数不存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在所述函数的结束位置后。
图4示出了处理源代码中的任一个函数的流程图,例如,根据前文所述,对源代码中的任一个函数进行异常处理块的查询(ExceptionHandlers),即步骤401:是否存在第一代码,当查询到该任一个函数中的异常处理块(ExceptionHandlers)的个数为0,该查询语句可以为:if(method.Body!=null&&method.Body.ExceptionHandlers!=null&&method.Body.ExceptionHandlers.Count==0),则表示该函数无异常处理块。即不存在catch块代码或finally块代码,则不存在第一代码,步骤406:需要添加第二代码(即try-catch块代码),当该函数的返回值类型为void类型,即不存在返回值时,则将try-catch块代码对该函数进行包围,即可以如下所示:
将try块代码的起始位置“try{”(即TryStart)设置在该函数的起始位置前,将所述try块代码的结束位置“}”(即TryEnd)以及所述catch块代“catch(异常类变量){异常信息的处理}”设置在所述函数的结束位置后。在确定位置后,步骤304:通过IL语句中的异常处理的添加语句进行添加try-catch块代码。在一些实例中,步骤303:根据该函数的返回值类型,确定添加该函数对应的用于异常处理的第二代码的位置,包括:当所述该函数存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在所述返回值的处理位置前。
例如,根据前文所述,当该函数的返回值类型为非void类型,即存在返回值时,则先要查找该函数的IL语句中的ret语句和Ldloc语句的位置,IL语句中的ret语句和Ldloc语句用于返回该函数返回值,也就是查找在IL语句中catch块代码运行后的跳转位置leave,在跳转位置leave前一个IL语句位置进行try块代码结束位置“try}”以及catch块代码的插桩。而try块代码起始位置“try{”依旧设置在该函数的起始位置前。在确定位置后,步骤304:通过IL语句中的添加异常处理的语句来添加try-catch块代码。
其中,添加try-catch块代码的语句可以为:
其中,ExceptionHandlers.Add()为函数添加异常处理块catch块代码,并制定try块代码开始位置TryStart为函数开始处,try块代码结束位置TryEnd对于返回值为void类型可以指定函数结尾,而对于返回值为非void类型TryEnd为catch处理之后的跳转的位置leave的前一个IL语句位置,而leave也是catch块代码异常处理之后需要跳转的位置leave,对于发生异常exception的函数leave之后的位置实际是执行不到的。
需要说明的是,在上述函数具有返回值的情况下,既不能影响该函数的返回值返回,还要实现在该函数中进行插桩,即插入用于异常处理的代码,保证当该函数发生异常,能够正常地捕获到该异常信息。
此外,一个try块代码可以对应零个或多个catch块代码,也可以对应零个或一个finally块代码。如果try块代码对应了多个catch块代码,当try块代码监测到异常后,指令CLR会自上而下搜索catch块代码,并通过异常过滤器筛选对应的异常信息,如果没有找到对应的异常信息,指令CLR将沿着调用堆栈,向更高层搜索匹配的异常信息,如果已到堆栈顶部依然没有找到对应的异常信息,就会抛出未处理的异常信息,这时catch块代码并不会被执行,所以距离try块代码最近的catch块代码将最先被遍历到。
步骤203:将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序。
其中,编译模块可以为编译器。
例如,根据前文所述,步骤305:将经过添加了上述try-catch块代码的源代码发送给编译器,该编译器可以为编译PC客户端,编译器将该经过处理的源代码进行编译,生成编译程序,再对该编译程序进行签名,步骤306:生成为待测试的可执行程序如,APK安装包(Android Package)。
步骤204:当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
在一些实例中,所述方法200进一步包括:步骤302:在所述源代码中任一个函数中引用(或调用)日志监控函数,其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:步骤407:通过所述引用(或调用)日志监控函数将所述异常信息(即发生异常的堆栈信息)发送至所述日志监控模块。
例如,根据前文所述,定义一个system.Exception类型变量,然后将该变量添加到上述函数中,用于保存异常信息所在的堆栈信息;通过InsertAfter函数是插入IL语句,InsertAfter函数是倒叙执行的,先执行将value是"MonoCecil:Exception has beenthrown"的字符串压入堆栈;再将value是将当前发生异常的堆栈信息保存到自定义变量varexception,然后调用或者引用日志监控函数,将字符串和varexception作为日志监控函数的参数传入,这样便把发生异常的堆栈信息通过日志监控函数进行输出。
其中,上述引用(或调用)日志监控函数将所述异常信息(即发生异常的堆栈信息)发送至所述日志监控模块的语句可以为:
var varexception=new
VariableDefinition(assembiy.MainModule.Import(typeof(System.Exception)));
method.Body.Variables.Add(varexception);
定义一个system.Exception类型变量,将该类型变量添加到被插桩函数(即函数),用于保存exception堆栈信息;
iworker.InsertAfter(tryend,iworker.Create(OpCodes.Rethrow));
iworker.InsertAfter(tryend,iworker.Create(OpCodes.Call,ritemethod_ref));
iworker.InsertAfter(tryend,iworker.Create(OpCodes.Ldloc,varexception));
iworker.InsertAfter(tryend,iworker.Create(OpCodes.Ldstr,"MonoCecil:Exception has been thrown"));
其中,InsertAfter函数是在tryend处也就是try块代码结束之后插入相应的IL语句,InsertAfter是倒叙执行的,iworker.Create(OpCodes.Ldstr,"MonoCecil:Exceptionhas been thrown")中的操作码Ldstr是将value是"MonoCecil:Exception has beenthrown"的字符串压入堆栈;OpCodes.Ldloc操作码是将value是将当前发生异常的堆栈信息保存到自定义变量varexception,然后插入OpCodes.Call调用writemethod_ref日志监控函数,将字符串和varexception作为日志监控函数参数传入,这样便把发生异常的堆栈信息通过日志监控函数进行输出;为了不影响函数正常的执行流程,插桩OpCodes.Rethrow重新抛出当前异常exception信息。
其中,在引用(或调用)日志监控函数前还包括:添加日志监控类;在添加日志监控类后,才可以引用日志监控函数。
其中,添加日志监控类的方式可以为:定义日志监控类MLogger,定义日志监控函数WLog,在日志监控类中添加日志监控函数,在源代码中添加日志监控类,从而实现添加日志监控类。
添加日志监控类的方式还可以为:将日志监控模块封装为dll文件MLogger,获取日志监控模块引用方法,将日志监控模块引用方法添加到源代码所属的逻辑模块中,获取日志监控函数引用方式。
在添加完日志监控类后,需要引用日志监控函数,引用日志监控函数的方式为:获取源代码文件(或dll文件)中包含的所有类,获取每个类的所有函数,根据日志监控函数的关键词引用日志监控函数。
其中,上述添加日志监控类到游戏逻辑代码程序集的语句可以为:
//定义日志监控类MLogger
TypeDefinition CMLogger=new TypeDefinition(@lognspace,"MLog",TypeAttributes.Sealed|TypeAttributes.BeforeFieldInit|TypeAttributes.Public,assembiy.MainModule.Import(typeof(System.Object)));
//定义日志监控函数WLog
MethodDefinition inMethod=new MethodDefinition(methodname,MethodAttributes.Public|MethodAttributes.HideBySig|MethodAttributes.Static,returntype);
//日志监控类添加日志监控函数
CMLogger.Methods.Add(inMethod);
//游戏逻辑代码添加日志监控类
assembiy.MainModule.Types.Add(CMLogger);
添加日志监控类到游戏逻辑代码程序集除了上述方式之外,还可以采用如下方式:
首先,将日志监控模块封装为dll文件MLogger,然后将日志监控模块引用添加到游戏逻辑模块(代码程序集);
Version ver=new Version("0.0.0.0");
//获取日志监控模块引用
AssemblyNameReference autoref=new AssemblyNameReference("MLogger",ver);
//将日志监控模块引用添加到游戏逻辑模块(代码程序集)
assembiy.MainModule.AssemblyReferences.Add(autoref);
获取日志监控函数引用,插桩直接调用或引用该日志监控函数;
其中,获取日志监控函数引用或调用的语句可以为:
foreach(Mono.Cecil.TypeDefinition mtype in assembiy.MainModule.Types)
{//获取dll文件(游戏逻辑代码程序集)中包含的所有类
if(mtype.ToString().Equals("MLogger.MLog"))
{
foreach(MethodDefinition wmethod in mtype.Methods)
{//获取每个类的所有函数
if(wmethod.Name=="WLog")
{
writemethod_ref=assembiy.MainModule.Import(wmethod);
}
}
}
}
需要说明的是,在源代码的函数中插入捕获代码时(如,该函数只有try-finally块代码、或既没有finally块代码也没有catch块代码或只没有catch块代码的情况),为了不影响源代码中的函数正常的运行,需要重新抛出当前发生的异常信息。例如,根据前文所述,步骤307:将APK安装包下发到多个终端设备104中,终端设备104运安装该APK安装包并生成应用程序,步骤308:运行该应用程序,在运行该应用程序过程中,当应用程序中对应的源代码会由对应的try-catch块代码对其进行异常监测,当该应用程序中对应的源代码发生异常时,对应的try-catch块代码会监测到该异常,根据上述获取到发生异常的堆栈信息的方式,捕获到该异常信息,即发生异常的堆栈信息,当对应的try-catch块代码中的catch块代码捕获到该异常信息时,步骤309:通过调用或引用日志监控函数,将该异常信息发送至日志监控模块,日志监控模块接收到该异常信息时,步骤310:创建日志并将该异常信息记录在日志中。当测试完成后,日志监控模块通过日志分析模块的接收接口,步骤311:将日志发送至日志分析模块,日志分析模块接收到这些日志后,对日志进行去重处理,步骤312:统计日志中记录的异常信息,步骤313:将异常信息以及异常信息发生的次数通过发送接口发送至第二客户端,即用于接收异常信息的客户端,以供程序人员对源代码进行再次的修改以及更新。
需要说明的是,日志除了记录异常信息外,还可以记录测试设备的信息。
此外,APK安装包可以包括但不限于:游戏安装包、视频安装包等。
对于添加第二代码进行获取异常信息的实例来说,步骤204是根据第二代码中的捕获代码获取异常信息的,即根据添加的捕获代码捕获的异常信息。应理解,该第二客户端应安装于终端设备101中,该终端设备101是程序人员的用来编译代码的设备。当应用程序在测试时,一旦发生异常且应用程序捕获到该异常信息,可以通过日志分析模块将该异常信息直接发送至第二客户端,程序人员无需再从测试人员那里获取异常信息,且测试人员也不用再去收集打印出来的异常信息,供程序人员查看,减少了测试人员的人力成本以及测试时间。
在一些实例中,所述方法200进一步包括:当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在捕获代码时,则执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码(即第一代码中的捕获代码)捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤。
例如,根据前文所述,对源代码中的任一个函数进行查询异常处理块(ExceptionHandlers),当查询到该任一个函数中的异常处理块(ExceptionHandlers)的个数大于0,即存在catch块代码或finally块代码,再基于类型关键词对查询到的异常处理块进行类型匹配,当异常处理块的类型关键词“catch”与“catch”匹配时,则该异常处理块为catch代码块,即第一代码存在catch块代码,无需添加其他类型块的代码(如,try块、catch块以及finally块),再根据上述前文中阐述的步骤203以及步骤204的内容(由于前文已经详细地阐述了具体实现方式,此处就不再赘述),步骤408:通过日志监控函数将捕获代码获取到的异常信息(发生异常的堆栈信息)发送至日志监控模块,再由日志监控模块发送至日志分析模块,日志分析模块在将处理后的异常信息发送至用于接收异常信息的客户端,以供程序人员对源代码进行再次的修改以及更新。
应理解,在本实例中,当确定出第一代码中存在catch块代码,那么第一代码可能存在try-catch块或try-catch-finally块代码,而无论是存在这两个类型的哪个类型块代码,都应视为该函数具有用于异常处理的代码,所以无需再继续判断当前函数的用于异常处理的代码的具体类型。
在一些实例中,若当所述第一代码包括监测代码和设置在所述监测代码后的捕获代码(即try-catch块代码);其中,所述方法200进一步包括:根据所述监测代码执行所述函数的代码,当所述监测机代码监测到该函数的代码中的异常信息时,将所述异常信息输入至所述捕获代码中,以使所述捕获代码获取到所述函数的异常信息。
需要说明的是,由于前文中已经详细阐述过第二代码存在try-catch块代码的情况,该try-catch块代码的具体实现方式,此处就不再赘述。
在一些实例中,所述方法200进一步包括:当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,在所述第一代码中添加所述捕获代码;在添加完所述捕获代码后,执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码(即第一代码中添加的捕获代码)捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤。
在一些实例中,当所述第一代码包括监测代码以及与所述监测代码对应的处理代码;其中,所述在所述第一代码中添加所述捕获代码,包括:存储所述处理代码,在存储所述处理代码后删除所述处理代码;在未删除前所述处理代码的位置上添加所述捕获代码;在所述捕获代码后添加存储的所述处理代码。
例如,根据前文所述,对源代码中的任一个函数进行查询异常处理块(ExceptionHandlers),即步骤401:是否存在第一代码,当查询到该任一个函数中的异常处理块(ExceptionHandlers)的个数大于0,即存在catch块代码或finally块代码,则存在第一代码,再基于类型关键词对查询到的异常处理块进行类型匹配,即步骤402:第一代码是否存在finally块代码,当异常处理块的类型关键词“finally”与“finally”匹配时,则该异常处理块为finally代码块,步骤403:第一代码是否还存在catch块代码,当第一代码存在finally块代码,且不存在catch块代码,则视为第一代码存在try-finally块代码,步骤404:在该finally块代码前插入catch块代码,具体为:先将finally块代码对应的IL语句保存,然后删除finally块代码对应的IL语句,插桩catch块代码,步骤405:调用或引用日志监控函数,将捕获到的发生异常的堆栈信息发送至日志监控模块,之后重新抛出异常信息,以保证不影响整个函数的执行流程,最后将保存的finally块代码对应的IL语句再插入到catch块代码的后面,从而保持IL语句的正确性。这样整个只有try-finally块代码的函数的就成为具有try-catch-finally块代码的函数,从而既可以实现监控发生异常的堆栈信息,还可以保证IL语句的正确性,不影响源代码的执行流程。
其中,上述根据关键词进行匹配的语句可以为:
其中,在上述try-finally块代码插桩catch块代码的语句可以为:
删除并保存finally块代码的异常处理块的IL语句,然后类似于无异常处理块的函数,插桩catch块代码的exception异常处理块;
删除已经存在的finally块代码处理,并将之前保存的finally块代码的异常处理块的IL语句添加到catch块代码的异常处理块之后;
在一些实例中,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码;当确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码,则执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码(即第一代码中添加的捕获代码)捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤。
其中,所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码(即当第一代码中存在finally块代码时,再判断是否存在catch块代码),包括:当查找到与所述捕获代码对应的监测代码的起始地址相同的其他监测代码的起始地址时,则确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码。
上述处理代码为finally块代码。
例如,当第一代码中存在finally块代码时,就被视为该第一代码中存在try-finally块代码,则遍历函数异常处理列表,查看该表中是否存在其他类型异常处理块的TryStart位置和finally块代码的TryStart位置是一样的,如果存在这样的异常处理块TryStart与finally块代码的TryStart位置一致,说明该函数存在catch块代码,则视为该函数存在try-catch-finally块代码;否则,该函数只存在try-finally块代码。
当确定该函数存在try-catch-finally块代码后,则根据上述前文中阐述的步骤203以及步骤204的内容(由于前文已经详细地阐述了具体实现方式,此处就不再赘述),步骤405:将捕获代码获取到的发生异常的堆栈信息即异常信息,通过引用或调用日志监控函数发送至日志监控模块,再由日志监控模块发送至日志分析模块,日志分析模块在将处理后的异常信息发送至用于接收异常信息的客户端,以供程序人员对源代码进行再次的修改以及更新。
需要说明的是,无论上述实例中是通过第一代码中原有的捕获代码、或后添加到第一代码中的捕获代码、或第二代码中的捕获代码获取的异常信息,都可以通过步骤204来实现,虽然各个捕获代码可能来自第一代码或者第二代码,但是各个捕获代码实现的功能和意义都是相同的,所以可以根据步骤204的具体实现方式去实现获取异常信息并发送异常信息至日志监控模块。
另,当源代码中的一个函数中的上述异常处理流程完成后,即保证该函数中存在catch块代码,且通过引用或调用日志监控函数将catch块代码捕获到的异常信息发送给了日志监控模块,则步骤409:继续处理该源代码中的下一个函数。
应理解,当函数中存在对应的第一代码时,无论该第一代码是catch块代码类型还是finally块代码类型亦或是catch块代码兼finally块代码类型,在该函数中都会对应一个try块代码,也就是说,该函数会存在try-catch块代码或try-catch-finally块代码。
在一些实例中,所述方法200进一步包括:当根据添加的捕获代码,将获取到异常信息抛出,以使得该异常信息被所述函数对应的异常处理代码所处理。
例如,当添加的catch块代码获取到的异常信息,抛出该异常信息,可以将该异常信息抛出至调用该函数的上一层源代码进行处理,如果该源代码可以处理该异常信息,则直接对该异常信息进行处理,如果该源代码无法处理该异常信息,则继续查找上一层调用该源代码的其他源代码来处理该异常信息,直到查找到处理该异常信息的源代码,从而保证该异常信息不会影响到整个应用程序的运行。,其中,抛出异常的具体实现方式已经在前文中阐述过了,此处就不再赘述。
需要说明的是,异常监控模块在上述实例中实现测试方法200时,可以通过调用插桩程序或插桩语句对源代码进行添加用于异常处理的代码,该插桩程序或插桩语句可以由IL语言的注入工具Cecil提供,它可以加载程序集,获取程序集包含的类、方法等类型,然后修改修改的类、方法或者变量等,然后再写回程序集。
由于越来越多的应用程序,特别是手机游戏程序,使用unity引擎开发,但其脚本语言却使用c#语言,且应用程序的版本迭代快,开发周期短,在应用程序完成新的开发或升级后,发布到外网,会发现一些偶然出现的问题,比如界面错乱、卡顿、闪退等问题,这些偶然出现的问题需要测试人员和程序花费大量时间复现来解决问题,效率较低;而这类问题很大部分是因为程序执行异常报错,导致功能出错,而在报错频繁的情况下就会导致卡顿,甚至有些会导致闪退的问题发生。
为了解决上述问题,可以集成sdk到应用程序(如,游戏应用程序)源代码中或者通过动态注入的方式拉起应用程序(如,游戏应用程序)进程,sdk通过注册unity引擎日志回调日志监控函数,监控unity引擎的异常日志;但集成sdk到源代码中的方式,会导致开发成本加大,同时需要专门的程序人员对sdk进行接入,并且sdk集成到源代码中,会增加应用程序安装包的容量,对源代码造成一定影响;而通过动态注入方式拉起应用程序进程通常需要Android操作系统的终端设备获得到root权限,但由于现在的厂商为了终端设备的安全性考虑,已经加大了获取root权限的困难度,所以终端设备获取root权限比较困难;除此之外,通过注册unity日志回调日志监控函数,对于那些被catch块代码的捕获的异常,如果测试人员没有打印出来,这种异常日志是无法监控的,这个对测试人员异常日志打印的行为存在一定的依赖性,否则程序人员无法得知到底发生了哪些异常。
而本实例的测试方法200不依赖应用程序的源代码,还可以捕获源代码中的所有异常,对测试人员打印异常日志的行为也无依赖性,因为异常信息在被捕获到后经过处理发送给了程序人员对应的客户端,使得程序人员能够直接知晓异常信息的发生,形成一个测试的闭环,程序人员根据客户端接收到的异常信息直接对源代码进行修改和升级;此外,本方法也可以对异常信息进行打印,打印的发生异常的堆栈信息不仅仅包括异常监控模块抛出的exception异常信息,还包括已经被catch块代码捕获的exception异常信息,但未被抛出的异常信息,由于第二类异常信息比较隐蔽,虽然异常信息被catch块代码捕获住了,但如果没有UI表象(即抛出异常信息),很容易被忽略,被捕获的异常并非都是符合预期的,它也可能导致某些潜在功能问题;并且本方法200无需在源代码中接入sdk,对源代码无任何影响;如果应用程序使用了Lua脚本,可以获取Lua脚本发生异常的堆栈信息,还可以对Lua脚本发生异常的堆栈信息进行打印;并且测试人员对异常信息的监控无感知,在进行应用程序功能测试时,异常监控模块就将测试中出现的异常信息监控下来,将发现的异常信息融入到功能测试过程中,提高测试质量和测试效率。
基于系统100,本申请的实例提出了一种程序监控方法,应用于监控系统。如图5所示,该方法500包括以下步骤:
步骤501:获取被测程序的源代码。
步骤502:当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码。
步骤503:对经过上述处理的所述源代码进行编译,得到待测试的可执行程序。
步骤504:运行所述待测试的可执行程序。
步骤505:记录所述用于异常处理的代码捕获到的异常信息。
步骤506:将所述异常信息发送至用于接收异常信息的客户端。
所述方法500进一步包括:在源代码中的任一个函数中引用日志监控函数;
其中,所述记录所述用于异常处理的代码捕获到的异常信息,包括:通过引用所述日志监控函数,输出所述用于异常处理的代码捕获到的异常信息至日志文件中;其中,所述方法500进一步包括:去除重复的所述日志文件;确定所述日志文件中的每个所述异常信息以及其发生的次数;其中,将所述异常信息发送至用于解决异常的客户端,包括:将所述异常信息以及其发生的次数发送至用于解决异常的客户端。
需要说明的是,上述方法500的具体实现方式已经在前文中详细地赘述过了,此处就不再赘述,只是本方法500的执行主体均为监控系统,与前文中提到的异常监控模块不同。
此外,上述监控系统按照物理划分,可以划分为一个硬件设备,也可以划分成多个硬件设备。
基于上述方法实例,本申请还提出了一种程序监控装置,应用在被测程序中异常监控模块,如图6所示,所述装置600包括:获取模块601、确定模块602、提供模块603以及发送模块604;且各个模块的功能具体如下:
需要说明的是,在实例中涉及到的异常监控模块、反编译模块、编译模块、运行模块、日志监控模块、日志分析模块等均可以视为是按照逻辑进行划分的模块,且上述这些模块在按照物理划分上来说,可以设置在同一个独立的硬件设备中,如,终端设备或服务器,也可以设置不同的独立的硬件设备中。
获取模块601,获取被测程序的源代码。
确定模块602,当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码。
提供模块603,将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序;
发送模块604,当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
在一些实例中,所述获取模块601,从反编译模块获取所述源代码,所述源代码为所述反编译模块对所述被测程序的原可执行程序进行反编译处理得到。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,确定模块602,当所述该函数不存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在所述函数的结束位置后。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,确定模块602,当所述该函数存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在处理所述返回值的位置前。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,确定模块602,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在捕获代码时,则使提供模块603执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及使发送模块604执行所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,所述发送模块604,将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述装置600进一步包括:添加模块,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,在所述第一代码中添加所述捕获代码;在添加完所述捕获代码后,使提供模块603执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及使发送模块604执行所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,发送模块604,将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,则所述第一代码包括监测代码以及与所述监测代码对应的处理代码;其中,所述添加模块,包括:存储单元,存储所述处理代码,在存储所述处理代码后删除所述处理代码;第一添加单元,在未删除前所述处理代码的位置上添加所述捕获代码;第二添加单元,在所述捕获代码后添加存储的所述处理代码。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;其中,所述确定模块602,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码;当确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码,则使提供模块603执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及使发送模块604执行所述当所述可执行程序在运行模块中运行时,将所述捕获代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;其中,发送模块604,将所述捕获代码捕获到的异常信息发送至日志监控模块。
在一些实例中,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;其中,所述发送模块604,将添加的所述捕获代码捕获到的异常信息发送至日志监控模块;其中,所述装置600进一步包括:输入模块,根据所述监测代码执行所述函数的代码,当所述监测机代码监测到该函数的代码中的异常信息时,将所述异常信息输入至所述捕获代码中,以使所述捕获代码获取到所述函数的异常信息。
在一些实例中,所述装置600进一步包括:抛出模块,当根据添加的捕获代码,将获取到异常信息抛出,以使得该异常信息被所述函数对应的异常处理代码所处理。
在一些实例中,所述确定模块602,当查找到与所述捕获代码对应的监测代码的起始地址相同的其他监测代码的起始地址时,则确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码。
在一些实例中,所述装置600进一步包括:引用模块,在所述源代码中的任一个函数中引用日志监控函数;其中,发送模块604,通过引用所述日志监控函数,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块。
基于上述方法实例,本申请还提出了一种程序监控系统,可以应用于终端设备中,如图7所示,所述系统700包括:获取模块701、确定模块702、编译模块703、测试模块704、记录模块705以及发送模块706;且各个模块的功能具体如下:
需要说明的是,在实例的系统700中涉及到的模块按照物理上划分可以设置在同一个独立的硬件设备中,如,终端设备或服务器,也可以设置不同的独立的硬件设备中,如,终端设备和服务器。
获取模块701,获取被测程序的源代码。
确定模块702,当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码。
编译模块703,对经过上述处理的所述源代码进行编译,得到待测试的可执行程序。
测试模块704,运行所述待测试的可执行程序。
记录模块705,记录所述用于异常处理的代码捕获到的异常信息。
发送模块706,将所述异常信息发送至用于接收异常信息的客户端。
在一些实例中,所述系统700进一步包括:引用模块,在源代码中的任一个函数中引用日志监控函数;其中,所述记录模块705,通过引用所述日志监控函数,输出所述用于异常处理的代码捕获到的异常信息至日志文件中;其中,所述系统700进一步包括:去重模块,去除重复的所述日志文件;所述确定模块702,确定所述日志文件中的每个所述异常信息以及其发生的次数;其中,发送模块706,将所述异常信息以及其发生的次数发送至用于解决异常的客户端。
图8示出了运行装置600-700所在的计算设备800的组成结构图。此计算设备800可以是服务器。如图8所示,该计算设备包括一个或者多个处理器(CPU)802、通信模块804、存储器806、用户接口810,以及用于互联这些组件的通信总线808。
处理器802可通过通信模块804接收和发送数据以实现网络通信和/或本地通信。
用户接口810包括一个或多个输出设备812,其包括一个或多个扬声器和/或一个或多个可视化显示器。用户接口810也包括一个或多个输入设备814,其包括诸如,键盘,鼠标,声音命令输入单元或扩音器,触屏显示器,触敏输入板,姿势捕获摄像机或其他输入按钮或控件等。
存储器806可以是高速随机存取存储器,诸如DRAM、SRAM、DDR RAM、或其他随机存取固态存储设备;或者非易失性存储器,诸如一个或多个磁盘存储设备、光盘存储设备、闪存设备,或其他非易失性固态存储设备。
存储器806存储处理器802可执行的指令集,包括:
操作系统816,包括用于处理各种基本系统服务和用于执行硬件相关任务的程序;
应用818,包括用于视频播放的各种应用程序,这种应用程序能够实现上述各实例中的处理流程,比如可以包括图6所示的运行装置600中的部分或全部模块,各模块601-604中的至少一个模块可以存储有机器可执行指令,处理器802通过执行存储器806中各模块601-604中至少一个模块中的机器可执行指令,进而能够实现上述各模块601-604中的至少一个模块的功能。
比如可以包括图7所示的运行装置700中的部分或全部模块,各模块701-706中的至少一个模块可以存储有机器可执行指令,处理器802通过执行存储器806中各模块701-706中至少一个模块中的机器可执行指令,进而能够实现上述各模块701-706中的至少一个模块的功能。
需要说明的是,上述各流程和各结构图中不是所有的步骤和模块都是必须的,可以根据实际的需要忽略某些步骤或模块。各步骤的执行顺序不是固定的,可以根据需要进行调整。各模块的划分仅仅是为了便于描述采用的功能上的划分,实际实现时,一个模块可以分由多个模块实现,多个模块的功能也可以由同一个模块实现,这些模块可以位于同一个设备中,也可以位于不同的设备中。
各实施例中的硬件模块可以以硬件方式或硬件平台加软件的方式实现。上述软件包括机器可读指令,存储在非易失性存储介质中。因此,各实施例也可以体现为软件产品。
各例中,硬件可以由专门的硬件或执行机器可读指令的硬件实现。例如,硬件可以为专门设计的永久性电路或逻辑器件(如专用处理器,如FPGA或ASIC)用于完成特定的操作。硬件也可以包括由软件临时配置的可编程逻辑器件或电路(如包括通用处理器或其它可编程处理器)用于执行特定操作。
另外,本申请的每个实例可以通过由数据处理设备如计算机执行的数据处理程序来实现。显然,数据处理程序构成了本申请。此外,通常存储在一个存储介质中的数据处理程序通过直接将程序读取出存储介质或者通过将程序安装或复制到数据处理设备的存储设备(如硬盘和或内存)中执行。因此,这样的存储介质也构成了本申请,本申请还提供了一种非易失性存储介质,其中存储有数据处理程序,这种数据处理程序可用于执行本申请上述方法实例中的任何一种实例。
图6-图7中的模块对应的机器可读指令可以使计算机上操作的操作系统等来完成这里描述的部分或者全部操作。非易失性计算机可读存储介质可以是插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展单元中设置的存储器。安装在扩展板或者扩展单元上的CPU等可以根据指令执行部分和全部实际操作。
另外,在本申请各个实例中的装置及各模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上装置或模块集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
Claims (15)
1.一种程序监控方法,其特征在于,所述方法包括:
获取被测程序的源代码;
当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;
将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序;及
当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
2.根据权利要求1所述的方法,其特征在于,所述获取被测程序的源代码包括:
从反编译模块获取所述源代码,所述源代码为所述反编译模块对所述被测程序的原可执行程序进行反编译处理得到。
3.根据权利要求1所述的方法,其特征在于,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;
所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;
其中,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置,包括:
当所述该函数不存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在所述函数的结束位置后。
4.根据权利要求1所述的方法,其特征在于,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;
所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;
其中,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的第二代码的位置,包括:
当所述该函数存在返回值时,将所述监测代码的起始位置设置在所述函数的起始位置前,将所述监测代码的结束位置以及所述捕获代码设置在处理所述返回值的位置前。
5.根据权利要求1所述的方法,其特征在于,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;
其中,所述方法进一步包括:
当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在捕获代码时,则执行
所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及
所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;
其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将所述捕获代码捕获到的异常信息发送至日志监控模块。
6.根据权利要求1所述的方法,其特征在于,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;
其中,所述方法进一步包括:
当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,在所述第一代码中添加所述捕获代码;
在添加完所述捕获代码后,执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及
所述当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;
其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将所述捕获代码捕获到的异常信息发送至日志监控模块。
7.根据权利要求6所述的方法,其特征在于,当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码不存在捕获代码时,则所述第一代码包括监测代码以及与所述监测代码对应的处理代码;
其中,所述在所述第一代码中添加所述捕获代码,包括:
存储所述处理代码,在存储所述处理代码后删除所述处理代码;
在未删除前所述处理代码的位置上添加所述捕获代码;及
在所述捕获代码后添加存储的所述处理代码。
8.根据权利要求1所述的方法,其特征在于,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;
其中,所述方法进一步包括:
当确定所述源代码的中任一个函数中的存在第一代码时,且所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码;
当确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码,则执行所述将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序的步骤;及
所述当所述可执行程序在运行模块中运行时,将所述捕获代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录的步骤;
其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将所述捕获代码捕获到的异常信息发送至日志监控模块。
9.根据权利要求1所述的方法,其特征在于,所述确定所述源代码中任一个函数不存在对应的用于异常处理的代码为第一代码;所述确定添加该函数对应的用于异常处理的代码为第二代码;
所述第二代码包括监测代码和设置在所述监测代码后的捕获代码,其中,所述监测代码用于监测所述函数的异常信息,所述捕获代码用于捕获所述监测代码监测到的异常信息;
其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:将添加的所述捕获代码捕获到的异常信息发送至日志监控模块;
其中,所述方法进一步包括:
根据所述监测代码执行所述函数的代码,当所述监测机代码监测到该函数的代码中的异常信息时,将所述异常信息输入至所述捕获代码中,以使所述捕获代码获取到所述函数的异常信息。
10.根据权利要求8所述的方法,其特征在于,所述第一代码存在处理代码时,确定所述第一代码是否存在捕获代码,包括:
当查找到与所述捕获代码对应的监测代码的起始地址相同的其他监测代码的起始地址时,则确定所述第一代码存在捕获代码和设置在所述捕获代码后的处理代码。
11.根据权利要求1所述的方法,其特征在于,所述方法进一步包括:
在所述源代码中的任一个函数中引用日志监控函数;
其中,所述将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,包括:
通过引用所述日志监控函数,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块。
12.一种程序监控方法,其特征在于,应用于监控系统,所述方法包括:
获取被测程序的源代码;
当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;
对经过上述处理的所述源代码进行编译,得到待测试的可执行程序;
运行所述待测试的可执行程序;
记录所述用于异常处理的代码捕获到的异常信息;及
将所述异常信息发送至用于接收异常信息的客户端。
13.一种程序监控装置,其特征在于,所述装置包括:
获取模块,获取被测程序的源代码;
确定模块,当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;
提供模块,将对经过上述处理的所述源代码提供给编译模块,以使其对所述源代码进行编译得到待测试的可执行程序;及
发送模块,当所述可执行程序在运行模块中运行时,将所述用于异常处理的代码捕获到的异常信息发送至日志监控模块,以使所述日志监控模块对所述异常信息进行记录。
14.一种程序监控系统,其特征在于,所述系统包括:
获取模块,获取被测程序的源代码;
确定模块,当确定所述源代码中任一个函数不存在对应的用于异常处理的代码时,根据该函数的返回值类型,确定添加该函数对应的用于异常处理的代码的位置并在该位置添加该函数对应的所述用于异常处理的代码;
编译模块,对经过上述处理的所述源代码进行编译,得到待测试的可执行程序;
测试模块,运行所述待测试的可执行程序;
记录模块,记录所述用于异常处理的代码捕获到的异常信息;
发送模块,将所述异常信息发送至用于接收异常信息的客户端。
15.一种存储介质,其特征在于,存储有一个或多个程序,所述一个或多个程序包括指令,所述指令当由计算设备执行时,使得所述计算设备执行权利要求1-12中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810271607.1A CN110321275A (zh) | 2018-03-29 | 2018-03-29 | 程序监控方法、装置、计算设备以及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810271607.1A CN110321275A (zh) | 2018-03-29 | 2018-03-29 | 程序监控方法、装置、计算设备以及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110321275A true CN110321275A (zh) | 2019-10-11 |
Family
ID=68110910
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810271607.1A Pending CN110321275A (zh) | 2018-03-29 | 2018-03-29 | 程序监控方法、装置、计算设备以及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110321275A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111949551A (zh) * | 2020-09-01 | 2020-11-17 | 网易(杭州)网络有限公司 | 应用程序测试方法、装置、设备及存储介质 |
CN112685045A (zh) * | 2020-12-28 | 2021-04-20 | 北京达佳互联信息技术有限公司 | 页面源文件的处理方法、装置、电子设备以及存储介质 |
CN112685316A (zh) * | 2021-01-04 | 2021-04-20 | 广州品唯软件有限公司 | 代码执行路径的获取方法、装置、计算机设备及存储介质 |
CN112948726A (zh) * | 2021-03-29 | 2021-06-11 | 建信金融科技有限责任公司 | 一种处理异常信息的方法、装置和系统 |
CN113468069A (zh) * | 2021-07-22 | 2021-10-01 | 腾讯科技(成都)有限公司 | 应用测试方法、装置、计算机设备及存储介质 |
CN113609012A (zh) * | 2021-07-30 | 2021-11-05 | 南京控维通信科技有限公司 | 规范化处理后端异常报错的方法及系统 |
WO2022068001A1 (zh) * | 2020-09-29 | 2022-04-07 | 苏州亿歌网络科技有限公司 | 基于gdb调试lua的方法、装置、设备及存储介质 |
CN114328168A (zh) * | 2020-10-09 | 2022-04-12 | 腾讯科技(深圳)有限公司 | 异常检测方法、装置、计算机设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102937930A (zh) * | 2012-09-29 | 2013-02-20 | 重庆新媒农信科技有限公司 | 应用程序监控系统及方法 |
US20150106348A1 (en) * | 2013-10-15 | 2015-04-16 | Oracle International Corporation | Monitoring business transaction failures involving database procedure calls |
CN106557396A (zh) * | 2015-09-25 | 2017-04-05 | 北京计算机技术及应用研究所 | 基于qemu的虚拟机程序运行状态监控方法 |
CN107015910A (zh) * | 2017-04-06 | 2017-08-04 | 上海云轴信息科技有限公司 | 保证异步程序健壮性的方法及设备 |
-
2018
- 2018-03-29 CN CN201810271607.1A patent/CN110321275A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102937930A (zh) * | 2012-09-29 | 2013-02-20 | 重庆新媒农信科技有限公司 | 应用程序监控系统及方法 |
US20150106348A1 (en) * | 2013-10-15 | 2015-04-16 | Oracle International Corporation | Monitoring business transaction failures involving database procedure calls |
CN106557396A (zh) * | 2015-09-25 | 2017-04-05 | 北京计算机技术及应用研究所 | 基于qemu的虚拟机程序运行状态监控方法 |
CN107015910A (zh) * | 2017-04-06 | 2017-08-04 | 上海云轴信息科技有限公司 | 保证异步程序健壮性的方法及设备 |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111949551A (zh) * | 2020-09-01 | 2020-11-17 | 网易(杭州)网络有限公司 | 应用程序测试方法、装置、设备及存储介质 |
WO2022068001A1 (zh) * | 2020-09-29 | 2022-04-07 | 苏州亿歌网络科技有限公司 | 基于gdb调试lua的方法、装置、设备及存储介质 |
CN114328168A (zh) * | 2020-10-09 | 2022-04-12 | 腾讯科技(深圳)有限公司 | 异常检测方法、装置、计算机设备和存储介质 |
CN112685045A (zh) * | 2020-12-28 | 2021-04-20 | 北京达佳互联信息技术有限公司 | 页面源文件的处理方法、装置、电子设备以及存储介质 |
CN112685316A (zh) * | 2021-01-04 | 2021-04-20 | 广州品唯软件有限公司 | 代码执行路径的获取方法、装置、计算机设备及存储介质 |
CN112948726A (zh) * | 2021-03-29 | 2021-06-11 | 建信金融科技有限责任公司 | 一种处理异常信息的方法、装置和系统 |
CN113468069A (zh) * | 2021-07-22 | 2021-10-01 | 腾讯科技(成都)有限公司 | 应用测试方法、装置、计算机设备及存储介质 |
CN113609012A (zh) * | 2021-07-30 | 2021-11-05 | 南京控维通信科技有限公司 | 规范化处理后端异常报错的方法及系统 |
CN113609012B (zh) * | 2021-07-30 | 2024-03-29 | 南京控维通信科技有限公司 | 规范化处理后端异常报错的方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110321275A (zh) | 程序监控方法、装置、计算设备以及存储介质 | |
CN106649084B (zh) | 函数调用信息的获取方法及装置、测试设备 | |
US10489274B2 (en) | Using emulation to disassociate verification from stimulus in functional test | |
US7299382B2 (en) | System and method for automatic test case generation | |
US11042471B2 (en) | System and method for providing a test manager for use with a mainframe rehosting platform | |
US20170255545A1 (en) | Methods and systems of function-specific tracing | |
US7698293B2 (en) | System and methods for capturing structure of data models using entity patterns | |
CN109542506B (zh) | 一种可灵活配置接口和快速交付服务的系统 | |
US20120239987A1 (en) | System and Method of Manipulating Virtual Machine Recordings for High-Level Execution and Replay | |
CN106559438A (zh) | 一种基于目标网络平台的程序上传方法和装置 | |
CN106294372A (zh) | 应用程序页面快速访问方法及应用其的移动终端 | |
CN108459962A (zh) | 代码规范性检测方法、装置、终端设备及存储介质 | |
US11294799B2 (en) | Plugin for multi-module code coverage in web applications | |
CN113688186B (zh) | 智能合约执行方法、引擎及区块链节点 | |
CN106294151A (zh) | 日志测试方法及装置 | |
CN108733589A (zh) | 分布式事务热部署的实现方法和装置 | |
US20150160955A1 (en) | Dynamically modifiable component model | |
US7636911B2 (en) | System and methods for capturing structure of data models using entity patterns | |
WO2020190597A1 (en) | Emulating non-traced code with a recorded execution of traced code | |
Papoulias et al. | Mercury: Properties and design of a remote debugging solution using reflection | |
CN109634838A (zh) | 定位应用程序故障的方法、装置、存储介质和电子设备 | |
CN114840410A (zh) | 测试分析方法、装置、计算机设备及存储介质 | |
US9652260B2 (en) | Scriptable hierarchical emulation engine | |
CN111045891B (zh) | 基于java多线程的监控方法、装置、设备以及存储介质 | |
CN108304230A (zh) | 调整应用属性的实现方法、装置及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |