CN108255585B - Sdk异常控制及应用程序运行方法、装置及其设备 - Google Patents
Sdk异常控制及应用程序运行方法、装置及其设备 Download PDFInfo
- Publication number
- CN108255585B CN108255585B CN201611236170.5A CN201611236170A CN108255585B CN 108255585 B CN108255585 B CN 108255585B CN 201611236170 A CN201611236170 A CN 201611236170A CN 108255585 B CN108255585 B CN 108255585B
- Authority
- CN
- China
- Prior art keywords
- thread
- abnormal
- target
- target thread
- path
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
-
- 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/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及通信技术领域,尤其涉及一种SDK异常控制及应用程序运行方法、装置及其设备。本发明所述的方法包括:向线程工厂提交被调用的功能接口相关的代码块;由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联;由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应。本发明通过调用SDK的功能接口向线程工厂提交相关的代码块,利用设置了异常捕获器的线程组监控与代码块对应目标线程的运行,从而实现异常事件的捕捉,并针对异常事件进行SDK重启、异常结果信息的收集,而不影响应用整体。
Description
【技术领域】
本发明涉及计算机技术领域,尤其涉及一种SDK异常控制及应用程序运行方法方法、系统及其设备。
【背景技术】
在项目开发中,经常会用到第三方SDK(Software Development Kit,软件开发工具包)提供的服务。它提供一套有一定结构和逻辑的对外开发接口,封装对内的业务逻辑。如广告、支付、UI控件、功能框架等。调用者只需按说明文档使用相应的对外开发接口就可以实现预期的功能,简化软件开发流程,在一定程度上提高了软件开发速度,并能保证软件的质量。
随着SDK开发思想在软件开发领域的不断普及,由于SDK代码的不可控,SDK开发者无法完全保证SDK逻辑及编码的正确性,也无法验证SDK在所有使用者应用上的集成效果,经常遇到因为SDK内部崩溃而导致应用程序崩溃的问题,一旦由于SDK崩溃而导致使用者应用崩溃,直接影响公司形象,影响SDK使用者的合作关系,极大的影响了产品的效果以及用户体验,带来经济损失。
然而现有的技术上并没有针对SDK内部崩溃而导致应用程序崩溃的问题提出过有效的解决方案,故急需为SDK提供的一种防崩溃的技术方案,最大程度上降低使用者和开发者双方的损失,维护应用的稳定性,从而保证整个软件开发的质量和效率。
【发明内容】
为了克服上述所指的现有技术中的不足之处,本发明提供一种SDK异常控制及应用程序运行方法、装置及其设备,以解决如上述现有技术中至少一个问题。
本发明解决上述技术问题所采用的技术方案如下:
一种SDK异常控制方法,包括如下步骤:
向线程工厂提交被调用的功能接口相关的代码块;
由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联;
由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应。
具体的,所述SDK异常控制方法,包括如下前置步骤:
判断调用该功能接口的调用行为是否需要回调,当无需回调,直接执行后续步骤,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,正常结束所述目标线程的执行;和/或,当需要回调,调用同步队列进行目标线程运行结果等待,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,由该同步队列将该目标线程运行结果实施相应的回调。
具体的,所述线程组包括多个异常捕获器,每个异常捕获器为该线程组的一个单元线程,多个异常捕获器用于分别响应不同的所述异常事件。
具体的,当所述目标线程发生异常事件时,触发一个与之相应的异常捕获器运行,以产生由该异常捕获器的运行所定义的预设响应。
具体的,所述每个异常捕获器被配置为其运行适于定义如下任意一种或任意多种预设响应:
终止所述目标线程的运行而使所述线程池执行其线程序列中的下一线程;
控制所述线程工厂重启所述目标线程的运行;
向调用所述功能接口的调用行为返回异常代码或预设结果信息;
向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调。
具体的,由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应的步骤,包括以下步骤:
获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址;
根据所述首地址获得目标线程对应的线程路径;
分析获得的所述线程路径获取其对应的返回结果,当分析后得到的返回结果为空或为无效路径时,则确定所述线程路径对应的目标线程为异常线程,而确定产生一个异常事件。
具体的,所述获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址,包括以下步骤:
遍历所述目标线程对应的栈基址;
从所述栈基址开始,对所述目标线程进行栈回溯,获得所述目标线程的执行首地址。
具体的,所述栈回溯是指通过栈结构反向层层推导,获取保存在栈中某一层中的变量值。
具体的,所述SDK异常控制方法,还包括以下步骤:
根据获得的线程路径,生成相应的用于指向预存的异常路径库的指向信息;
依据于所述指向信息,比较所述线程路径与所述指向信息对应于所述异常路径库的指向路径;
当所述线程路径与所述异常路径库中的指向路径相同时,判定该线程路径为异常线程。
具体的,所述异常路径库根据历史线程发生异常事件时存储的与该线程对应的路径组成的数据库;或者根据云端数据构建而成。
相应的,本发明还提供一种应用程序运行方法,包括以下步骤:
调用SDK提供的功能接口以运行所述功能接口对应的目标线程;
响应该目标线程后的回调,处理与该目标线程运行相关结果,当所述相关结果为该目标线程经异常处理后返回的异常代码,输出告警信息或忽略所述相关结果;当所述相关结果为预设结果信息时,执行为该相关结果预设的处理模块。
具体的,所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
可选的,以如下任意方式输出所述告警信息:
静默向预设接收者发送所述的异常代码;
向屏幕弹窗显示所述异常代码。
相应的,一种SDK异常控制装置,包括:
提交模块:用于向线程工厂提交被调用的功能接口相关的代码块;
建立模块:用于由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联;
触发模块:用于由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应。
进一步的,所述SDK异常控制装置,包括如下前置模块:
判断模块:用于判断调用该功能接口的调用行为是否需要回调,当无需回调,直接执行后续步骤,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,正常结束所述目标线程的执行;和/或,当需要回调,调用同步队列进行目标线程运行结果等待,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,由该同步队列将该目标线程运行结果实施相应的回调。
具体的,所述线程组包括多个异常捕获器,每个异常捕获器为该线程组的一个单元线程,多个异常捕获器用于分别响应不同的所述异常事件。
具体的,当所述目标线程发生异常事件时,触发一个与之相应的异常捕获器运行,以产生由该异常捕获器的运行所定义的预设响应。
具体的,所述每个异常捕获器被配置为其运行适于定义如下任意一种或任意多种预设响应:
终止所述目标线程的运行而使所述线程池执行其线程序列中的下一线程;
控制所述线程工厂重启所述目标线程的运行;
向调用所述功能接口的调用行为返回异常代码或预设结果信息;
向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调。
具体的,所述触发模块包括以下单元:
栈回溯单元:用于获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址;
路径单元:用于根据所述首地址获得目标线程对应的线程路径;
确定单元:用于分析获得的所述线程路径获取其对应的返回结果,当分析后得到的返回结果为空或为无效路径时,则确定所述线程路径对应的目标线程为异常线程,而确定产生一个异常事件。
具体的,所述栈回溯单元包括以下子单元:
遍历子单元:用于遍历所述目标线程对应的栈基址;
回溯子单元:用于从所述栈基址开始,对所述目标线程进行栈回溯,获得所述目标线程的执行首地址。
具体的,所述栈回溯是指通过栈结构反向层层推导,获取保存在栈中某一层中的变量值。
进一步的,所述SDK异常控制装置,还包括:
指向模块:用于根据获得的线程路径,生成相应的用于指向预存的异常路径库的指向信息;
比较模块:用于依据于所述指向信息,比较所述线程路径与所述指向信息对应于所述异常路径库的指向路径;
判定模块:用于当所述线程路径与所述异常路径库中的指向路径相同时,判定该线程路径为异常线程。
具体的,所述异常路径库根据历史线程发生异常事件时存储的与该线程对应的路径组成的数据库;或者根据云端数据构建而成。
相应的,本发明还提供一种应用程序运行装置,包括:
调用模块:用于调用SDK提供的功能接口以运行所述功能接口对应的目标线程;
处理模块:用于响应该目标线程后的回调,处理与该目标线程运行相关结果,当所述相关结果为该目标线程经异常处理后返回的异常代码,输出告警信息或忽略所述相关结果;当所述相关结果为预设结果信息时,执行为该相关结果预设的处理模块。
具体的,所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
具体的,以如下任意方式输出所述告警信息:
静默向预设接收者发送所述的异常代码;
向屏幕弹窗显示所述异常代码。
相应的,本发明还提供一种终端设备,
包括显示屏、存储器和一个或多个处理器,所述一个或多个处理器被配置用于执行上述任意一项所述方法中的步骤。
与现有技术相比,本发明具备如下优点:
总的来说,本发明通过调用SDK提供的功能接口向线程工厂提交代码块,以针对该代码块创建相关的目标线程,并建立该目标线程与设置了异常捕获器的线程组之间的关联,由线程组监控所述目标线程的运行,进而所述异常捕获器针对目标线程运行过程中出现的异常事件进行相应的处理,起到捕获线程运行异常以保护SDK正常工作的作用,在一定程度上提高了软件开发的速度,维持了应用的稳定性,进而保障整个软件开发的质量以及效率,提高产品的效果以及保证用户的使用体验。
另外,针对SDK被调用的功能接口判断其是否进行回调异常信息,进而通过文件存储、网络传输、日志打印的方式对异常信息进行分析,保证SDK的正常运行,降低了SDK的异常指数,并保证了软件的质量。
还有的,本发明通过对目标线程进行栈回溯获取其执行首地址,再基于该执行首地址获得与其对应的线程路径,进而通过分析所述线程路径确认其对应目标线程是否为异常线程,而确定产生一个异常事件。其提高了异常检测的速率,另外还通过将所述线程路径与预设的异常路径库中的指向路径进行比较以判定其为异常路径的方式,保证了异常线程检测的准确度。
综上所述,本发明在一定程度上提高了软件开发的速度,维持了应用的稳定性,进而保障整个软件开发的质量以及效率,提高产品的效果以及保证用户的使用体验。另外保证SDK的正常运行,降低了SDK的异常指数,并保证了软件的质量;而且还提高了异常检测的速率,保证异常线程检测的准确度。
【附图说明】
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明中一种SDK异常控制方法的第一实施例的流程图;
图2为本发明中一种SDK异常控制方法的实施例的流程图;
图3为本发明中一种SDK异常控制方法的实施例的流程图;
图4为本发明中一种SDK异常控制方法的第二实施例的流程图;
图5为本发明中一种应用程序运行方法的一实施例的流程图;
图6为本发明中一种SDK异常控制装置的第一实施例的结构框图;
图7为本发明中一种SDK异常控制装置的实施例的结构框图;
图8为本发明中一种SDK异常控制装置的实施例的结构框图;
图9为本发明中一种SDK异常控制装置的第二实施例的结构框图;
图10为本发明中一种应用程序运行装置的一实施例的结构框图;
图11为本发明中调用SDK无回调返回结果接口流程图;
图12为本发明中调用SDK回调返回结果接口流程图。
【具体实施方式】
下面结合附图和示例性实施例对本发明作进一步地描述,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。此外,如果已知技术的详细描述对于示出本发明的特征是不必要的,则将其省略。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
本技术领域技术人员可以理解,下文所使用的“终端”、“终端设备”或者“移动通信终端”是指可以在移动中使用的计算机设备,广义的讲包括手机、笔记本、平板电脑、POS机甚至包括车载电脑。这里所使用的“终端”、“终端设备”可以是便携式、可运输、安装在交通工具(航空、海运和/或陆地)中的,或者适合于和/或配置为在本地运行,和/或以分布形式,运行在地球和/或空间的任何其他位置运行。这里所使用的“终端”、“终端设备”还可以是通信终端、上网终端、音乐/视频播放终端,例如可以是PDA、MID(Mobile Internet Device,移动互联网设备)和/或具有音乐/视频播放功能的移动电话,也可以是智能电视等设备。这里所使用的“终端”、“终端设备”也拥有非常丰富的通信方式,即可以通过GSM,CDMA,WCDMA,EDGE,3G等无线运营网通讯,也可以通过无线局域网,蓝牙和红外进行通信。
SDK(Software Development Kit,软件开发工具包)是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合,它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。一般的工具包括用于调试和其他用途的实用工具。SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程池,是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。每当线程池需要创建一个线程时,都是通过调用线程工厂方法来完成的。
线程组(ThreadGroup)就是由线程组成的管理线程的类,这个类是java.lang.ThreadGroup类。所有线程都隶属于一个线程组,那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。每个应用都至少有一个线程从属于系统线程组。若创建多个线程而不指定一个组,它们就会自动归属于系统线程组。在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。
为了使本技术领域的人员更好地理解本发明实施例的方案,下面结合附图和实施方式对本发明作进一步的详细说明。以下实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
请参阅附图1所示的一种SDK异常控制方法的一个实施例的流程图,本发明所述一种SDK异常控制方法包括以下步骤:
S101,向线程工厂提交被调用的功能接口相关的代码块;
具体的,本发明实施例中,所述SDK异常控制方法,包括如下前置步骤:
判断调用该功能接口的调用行为是否需要回调,如图11所示调用SDK无回调返回结果接口流程图,当无需回调,直接执行后续步骤,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,正常结束所述目标线程的执行;和/或,如图12所示调用SDK回调返回结果接口流程图,当需要回调,调用同步队列进行目标线程运行结果等待,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,由该同步队列将该目标线程运行结果实施相应的回调。
本发明针对SDK被调用的功能接口判断其是否进行回调异常信息,进而通过文件存储、网络传输、日志打印的方式对异常信息进行分析,保证SDK的正常运行,降低了SDK的异常指数,并保证了软件的质量。
本发明实施例中,所述代码块是一种常见的代码形式,其用大括号“{}”将多行代码封装在一起,形成一个独立的代码区。
本发明实施例中,当创建一个类的线程对象时,使用线程工厂集中线程对象的创建,获取容易改变创建线程对象的类的优势,或创建这些线程对象的方式,容易限制创建线程对象的有限资源。比如,我们只能有一个类型的N个对象,就很容易产生关于线程对象创建的统计数据。
本发明实施例中,Java提供线程工厂接口,用来实现一个线程对象工厂。Java并发API(Application Programming Interface,应用程序编程接口)的一些高级工具,如执行者框架或Fork/Join框架,使用线程工厂创建线程。
其中,本发明实施例中,通过创建一个新的java项目,创建一个类名为MyThreadFactory一定实现线程工厂接口,如:
public class MyThreadFactory implements ThreadFactory{}
本发明实施例中,将预置的代码块加入所述线程工厂中,再将线程厂的数据写入控制台,如:
System.out.printf("Factory stats:\n");
System.out.printf("%s\n",factory.getStats());
本发明实施例中,所述线程工厂接口的源码如下:
public interface ThreadFactory{}
Thread newThread(Runnable r);
需要说明的是,上述代码只是实现本发明实施例的一个方法,不能对本发明构成限制。
S102,由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联;
具体的,所述线程组包括多个异常捕获器,每个异常捕获器为该线程组的一个单元线程,多个异常捕获器用于分别响应不同的所述异常事件。
本发明实施例中,实现newThread()方法,将接收Runnable接口并返回一个线程对象至所述Runnable接口。因此生成线程对象的名字,然后创建新的线程对象,最后保存统计数据,如以下Java代码:
Thread(Runnable target)
Thread(Runnable target,String name)
Thread(ThreadGroup group,Runnable target)
Thread(ThreadGroup group,Runnable target,String name)
Thread(ThreadGroup group,Runnable target,String name,long stackSize)
本发明实施例中,接收Runnable对象作为参数并返回一个线程对象,最基本的线程工厂只有一行,如:
return new Thread(r);
如图2所示流程图,可以选择的,另一可行实施例中,所述步骤S102中,所述由线程工厂为该代码块创建相应的目标线程包括:
S1021,接收所述代码块中归属于至少一种线程类型的线程创建请求,所述线程创建请求包含与其所属线程类型相匹配的请求处理参数;
S1022,根据所述线程建立请求,确定与所述线程类型相匹配的线程模板;
S1023,将所述请求处理参数与相匹配的线程模板相结合,创建与所述线程建立请求相应的线程。
其中,所述线程类型具体包括但不限于:用于处理定时任务的线程;用于处理数据包格式的线程;用于处理建立连接及收发消息的线程。
其中,与用于处理定时任务的线程相匹配的请求处理参数,具体包括:定时任务的线程执行方法;定时任务的时间。
其中,与用于处理数据包格式的线程相匹配的请求处理参数,具体包括:处理预定格式的数据包的方法;对收包格式的定义参数;对发包格式的定义参数。
其中,与用于处理建立连接及收发消息的线程相匹配的请求处理参数,具体包括:建立连接的监测端口信息;对传输数据的处理方法。
本发明实施例中,所述线程模板包括用于处理定时任务的线程模板、用于处理PB数据包格式的线程模板、用于处理建立socket连接及收发消息的线程模板。
本发明实施例中,所述步骤S102中,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联的步骤中,具体包括:
分析所述目标线程归属的类型;
依据其归属的类型,指定与所述目标线程相对应的线程组;
将预置的异常捕获器安置于所述线程组中并调用相关的关联函数监测所述目标线程的运行。
S103,由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应。
本发明通过对目标线程进行栈回溯获取其执行首地址,再基于该执行首地址获得与其对应的线程路径,进而通过分析所述线程路径确认其对应目标线程是否为异常线程,而确定产生一个异常事件。其提高了异常检测的速率,另外还通过将所述线程路径与预设的异常路径库中的指向路径进行比较以判定其为异常路径的方式,保证了异常线程检测的准确度。
具体的,如图3所示的流程图,步骤S103包括以下步骤:
S1031,获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址;
具体的,步骤S1031,包括以下步骤:
遍历所述目标线程对应的栈基址;
从所述栈基址开始,对所述目标线程进行栈回溯,获得所述目标线程的执行首地址。
具体的,所述栈回溯是指通过栈结构反向层层推导,获取保存在栈中某一层中的变量值。
具体的,所述遍历是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。另外的所述遍历也适合于多元素集合的情况,如数组。
假设以ExWorkerQueue[DelayedWorkQueue]工作队列为例,如果对该队列进行遍历,首先需要获得该工作队列中线程列表的头节点,本发明实施例中采用的C++代码如下:
Queue=&ExWorkerQueue[DelayedWorkQueue];
其中,Queue是一个变量,&为取地址运算符,上述代码行实现的是对ExWorkerQueue[DelayedWorkQueue]工作队列取首地址,即为该工作队列中线程列表的头节点地址。
从头节点地址开始,对ExWorkerQueue[DelayedWorkQueue]工作队列进行循环遍历,得到该工作队列中所有线程的栈基址。具体的实现方法可以是任何一种现有技术,本发明对此不作限制。
需要说明的是,该代码只是实现本发明实施例的一个方法,不能对本发明构成限制。
本发明实施例中,栈回溯是一个循环的过程,目标线程的执行首地址可以看做一个变量值,如果需要得到该执行首地址,必须对栈回溯设定一个终止的条件。
本发明实施例中,在变量扩展基址指针寄存器(ebp)中存放一个指针,该指针指向栈最上面一个栈帧的底部。在栈回溯的过程中,这个数值不断的发生变化,直到满足某个条件时,停止栈回溯。
本发明实施例中,以线程工厂提供的创建线程的函数假设为:PspCreateThreadStartup的内部地址的值来设定终止栈回溯的条件。线程工厂在创建与代码块相应的目标线程时,会调用PspSystemThreadStartup,该函数内部会使用目标线程的执行逻辑首地址。所以,在栈中值为该函数的内部偏移的地址附近,即保存了当前目标线程的执行首地址。因此,在函数PspSystemThreadStartup上加一个小的偏移量,便可以设定为终止栈回溯的条件。当ebp中的数值与该偏移量相等时,ebp-8处保存的整数便为当前目标线程的执行首地址。
需要说明的是,该终止条件只是实现本发明的其中一个条件,可以通过设立其他终止条件结束栈回溯的过程,本发明对此不作限制。
S1032,根据所述首地址获得目标线程对应的线程路径;
本发明实施例中,每一个线程组模块均分配有相应的内存,每一条目标线程都有对应的线程组模块,该线程组模块中包含该线程的相关信息。如果能得到目标线程对应的线程组模块,便可以通过该线程组模块确定其对应的目标线程的线程路径。
本发明实施例中,利用预设的函数来获得线程组模块列表及其对应的内存范围。得到的目标线程的执行首地址匹配所得到的各个线程组模块的内存范围,如果所述执行首地址落在某个线程组模块的内存范围之内,该线程组模块就是所述执行首地址对应目标线程的模块,确定目标线程对应的线程组模块之后,可以通过读取该线程组模块中包含该线程的相关信息,得到目标线程对应的线程路径。
S1033,分析获得的所述线程路径获取其对应的返回结果,当分析后得到的返回结果为空或为无效路径时,则确定所述线程路径对应的目标线程为异常线程,而确定产生一个异常事件。
本发明实施例中,根据获得的所述目标线程对应的线程路径,向该线程路径对应的线程组模板发送相应的查询指令,当接收到该线程组模块响应于所述查询指令而反馈的值为空值或无效路径值时,确认其对应的目标线程为异常线程。
具体的,本发明实施例中,当所述目标线程发生异常事件时,触发一个与之相应的异常捕获器运行,以产生由该异常捕获器的运行所定义的预设响应。
具体的,本发明实施例中,所述每个异常捕获器被配置为其运行适于定义如下任意一种或任意多种预设响应:
终止所述目标线程的运行而使所述线程池执行其线程序列中的下一线程;
控制所述线程工厂重启所述目标线程的运行;
向调用所述功能接口的调用行为返回异常代码或预设结果信息;
向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调。
另外的,本发明实施例中,所述控制所述线程工厂除了使重启所述目标线程的运行,还包括使所述目标线程执行终止指令或等待指令;其中所述终止指令用于激发终止信号,并将该终止信号发送至当前目标线程,该目标线程将退出到终止状态;所述等待指令用于激发等待信号,并将该等待信号发送至当前目标线程,直到其他线程唤醒处于等待状态的目标线程。
本发明实施例中,在确认目标线程是异常线程之后,进行后续处理,即产生由该异常捕获器的运行所定义的预设响应,还包括对所述异常线程执行挂起操作。
本发明实施例中,调用SDK系统提供的挂起目标线程的函数来对异常线程执行挂起操作。该函数以步骤S1031中得到的执行逻辑首地址作为参数,可以将对应的异常线程稳定的挂起。
需要说明的是,对异常线程的处理方法并不局限于本发明实施例提出的方法,还可以有其他方法,本发明对此不做限制。
本发明实施例中,由于已经将异常线程挂起或终止,可选的控制所述线程工厂重启所述目标线程的运行,另外将依据SDK提供的所述功能接口的调回指令,将异常线程对应的异常代码或者预设结果信息进行输出。其中所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
本发明通过调用SDK提供的功能接口向线程工厂提交代码块,以针对该代码块创建相关的目标线程,并建立该目标线程与设置了异常捕获器的线程组之间的关联,由线程组监控所述目标线程的运行,进而所述异常捕获器针对目标线程运行过程中出现的异常事件进行相应的处理,起到捕获线程运行异常以保护SDK正常工作的作用,在一定程度上提高了软件开发的速度,维持了应用的稳定性,进而保障整个软件开发的质量以及效率,提高产品的效果以及保证用户的使用体验。
请参阅附图4所示的一种SDK异常控制方法的一个实施例的流程图,本发明所述一种SDK异常控制方法包括以下步骤:
S201,根据获得的线程路径,生成相应的用于指向预存的异常路径库的指向信息。
具体的,本发明实施例中,所述异常路径库根据历史线程发生异常事件时存储的与该线程对应的路径组成的数据库;或者根据云端数据构建而成。
本发明实施例中,所述指向信息指的是针对所述线程路径以获取预存的异常路径库的索引数据。通过所述索引数据获得与所述线程路径相应的异常路径库。
S202,依据于所述指向信息,比较所述线程路径与所述指向信息对应于所述异常路径库的指向路径。
本发明实施例中,根据所述异常路径库中存储的历史异常数据中的指向路径,计算所述线程路径与所述指向路径之间的差异值,当在根据所述差异值预置的允许差异范围内,所述线程路径不与所述指向路径相同;当超出所述允许差异范围时,确定所述线程路径对应的目标线程为异常线程。
本发明实施例中,当所述线程路径不与所述指向路径相同时,包括以下后置可选步骤:
将释放所述目标线程,并调用相关的重启函数重新启动该目标线程。
需要说明的是,其中比较线程路径与指向路径的方法和重启目标线程的方法并不局限于本发明实施例提出的方法,还可以有其他方法,本发明对此不做限制。
S203,当所述线程路径与所述异常路径库中的指向路径相同时,判定该线程路径为异常线程。
本发明实施例中,所述线程路径一旦被判定为所述异常线程,其将异常的线程路径次相应得路径信息存储记录于所述异常路径库中,其包括以下步骤:
依据判定结果获取所述异常的目标线程的线程路径对应的路径信息,并将生成与该路径信息相关的标识信息以用于标识该目标线程的线程路径;
将所述路径信息添加至所述异常路径库中与所述标识信息相对应的位置。
本发明实施例中,通过建立的异常路径库提高了异常检测的精确度,以针对已知的异常事件进行处理并收集未知的异常路径,起到丰富该异常路径库的作用。
请参阅附图5所示的一种应用程序运行方法的一个实施例的流程图,本发明所述一种应用程序运行方法包括以下步骤:
S301,调用SDK提供的功能接口以运行所述功能接口对应的目标线程。
本发明实施例中,所述运行功能接口对应的目标线程包括:在目标线程的Thread对象上调用start()方法;在调用start()方法之前,线程处于新状态中,其中所述新状态指有一个Thread对象,还没有一个真正的线程。
在调用start()方法之后,包括以下几种情况:
启动新的执行线程(具有新的调用栈);
该目标线程从新状态转移到可运行状态;
当该目标线程获得机会执行时,其目标run()方法将运行。
本发明实施例中,获取当前目标线程的对象的方法是:
Thread.currentThread();
其中,本发明实施例中,当线程目标run()方法结束时该目标线程完成。
S302,响应该目标线程后的回调,处理与该目标线程运行相关结果,当所述相关结果为该目标线程经异常处理后返回的异常代码,输出告警信息或忽略所述相关结果;当所述相关结果为预设结果信息时,执行为该相关结果预设的处理模块。
具体的,本发明实施例中,所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
本发明实施例中,所述响应该目标线程后的回调,具体包括如下步骤:
当所述目标线程执行结束后将生成相关的执行结果;
依据于该执行结果,获取针对SDK功能接口设定的回调请求;
根据所述回调请求生成相对应的回调函数以回调其执行结果。
本发明实施例中,所述回调函数就是一个通过函数指针调用的函数。
其中,当函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,即为所述回调函数,如:
def getOddNumber(k,getEvenNumber);
return 1+getEvenNumber(k)
其中,所述回调函数用于针对异常事件或该异常事件对应产生的条件执行响应后的执行结果的回调。
其中,本发明实施例中,所述告警信息表示针对执行结果生成的关于所述异常事件的提示信息;其反映目标线程在执行过程中出现的异常事件以及该异常事件带来的效果。
可选的,本发明发明实施例中,以如下任意方式输出所述告警信息:
静默向预设接收者发送所述的异常代码;
向屏幕弹窗显示所述异常代码。
其中所述静默向预设接收者发送所述的异常代码,包括针对所述异常结果信息获取相对应的静默发送权限;依据于该静默发送权限生成相应的获取指令以获取所述异常代码及静默信息;接收所述异常代码并在所述静默发送权限的基础上发送所述异常代码。其中所述静默信息包括静默发送所述异常代码的路径信息和/或指令信息、所述接收者的地址信息和/或代称信息。所述静默发送权限的基础上,依据所述静默信息向接收者发送该异常代码。另外还包括所述静默向预设接收者发送所述的异常代码的步骤中包括的后置步骤:接收由接收者响应于所述异常代码而进行操作的处理指令,以根据该处理指令控制所述异常捕获器进行异常线程的处理工作。
其中所述向屏幕弹窗显示所述异常代码,包括依据于所述异常事件而执行的异常捕获或异常数据分析或异常线程重启,并发提取所述异常代码;根据提取的异常代码将其转换为可显示的图像信息以显示于所述屏幕弹窗中。本发明实施例中,所述异常代码的显示形式包括屏幕弹窗、界面显示框、单独显示界面、界面下拉栏等。
本发明实施例中,该应用程序的运行依据SDK提供的功能接口,对目标线程运行时出现的异常事件而产生的预设结果信息进行回调,以将异常代码发送至接收者或者显示于屏幕界面,具有时效性以及可控性。
请参阅附图6所示的一种SDK异常控制装置的一个实施例的结构框图,本发明所述一种SDK异常控制装置包括:
提交模块:用于向线程工厂提交被调用的功能接口相关的代码块。
进一步的,所述SDK异常控制装置,包括如下前置模块:
判断模块11:用于判断调用该功能接口的调用行为是否需要回调,当无需回调,直接执行后续步骤,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,正常结束所述目标线程的执行;和/或,当需要回调,调用同步队列进行目标线程运行结果等待,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,由该同步队列将该目标线程运行结果实施相应的回调。
本发明针对SDK被调用的功能接口判断其是否进行回调异常信息,进而通过文件存储、网络传输、日志打印的方式对异常信息进行分析,保证SDK的正常运行,降低了SDK的异常指数,并保证了软件的质量。
本发明实施例中,所述代码块是一种常见的代码形式,其用大括号“{}”将多行代码封装在一起,形成一个独立的代码区。
本发明实施例中,当创建一个类的线程对象时,使用线程工厂集中线程对象的创建,获取容易改变创建线程对象的类的优势,或创建这些线程对象的方式,容易限制创建线程对象的有限资源。比如,我们只能有一个类型的N个对象,就很容易产生关于线程对象创建的统计数据。
本发明实施例中,Java提供线程工厂接口,用来实现一个线程对象工厂。Java并发API(Application Programming Interface,应用程序编程接口)的一些高级工具,如执行者框架或Fork/Join框架,使用线程工厂创建线程。
其中,本发明实施例中,通过创建一个新的java项目,创建一个类名为MyThreadFactory一定实现线程工厂接口,如:
public class MyThreadFactory implements ThreadFactory{}
本发明实施例中,将预置的代码块加入所述线程工厂中,再将线程厂的数据写入控制台,如:
System.out.printf("Factory stats:\n");
System.out.printf("%s\n",factory.getStats());
本发明实施例中,所述线程工厂接口的源码如下:
public interface ThreadFactory{}
Thread newThread(Runnable r);
需要说明的是,上述代码只是实现本发明实施例的一个方法,不能对本发明构成限制。
建立模块12:用于由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联。
具体的,所述线程组包括多个异常捕获器,每个异常捕获器为该线程组的一个单元线程,多个异常捕获器用于分别响应不同的所述异常事件。
本发明实施例中,实现newThread()方法,将接收Runnable接口并返回一个线程对象至所述Runnable接口。因此生成线程对象的名字,然后创建新的线程对象,最后保存统计数据,如以下Java代码:
Thread(Runnable target)
Thread(Runnable target,String name)
Thread(ThreadGroup group,Runnable target)
Thread(ThreadGroup group,Runnable target,String name)
Thread(ThreadGroup group,Runnable target,String name,long stackSize)
本发明实施例中,接收Runnable对象作为参数并返回一个线程对象,最基本的线程工厂只有一行,如:
return new Thread(r);
如图7所示结构框图,可以选择的,另一可行实施例中,所述建立模块12中,所述由线程工厂为该代码块创建相应的目标线程包括:
创建单元1001,用于接收所述代码块中归属于至少一种线程类型的线程创建请求,所述线程创建请求包含与其所属线程类型相匹配的请求处理参数;
模板单元1002,用于根据所述线程建立请求,确定与所述线程类型相匹配的线程模板;
结合单元1003,用于将所述请求处理参数与相匹配的线程模板相结合,创建与所述线程建立请求相应的线程。
其中,所述线程类型具体包括但不限于:用于处理定时任务的线程;用于处理数据包格式的线程;用于处理建立连接及收发消息的线程。
其中,与用于处理定时任务的线程相匹配的请求处理参数,具体包括:定时任务的线程执行方法;定时任务的时间。
其中,与用于处理数据包格式的线程相匹配的请求处理参数,具体包括:处理预定格式的数据包的方法;对收包格式的定义参数;对发包格式的定义参数。
其中,与用于处理建立连接及收发消息的线程相匹配的请求处理参数,具体包括:建立连接的监测端口信息;对传输数据的处理方法。
本发明实施例中,所述线程模板包括用于处理定时任务的线程模板、用于处理PB数据包格式的线程模板、用于处理建立socket连接及收发消息的线程模板。
本发明实施例中,所述建立模块12中,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联的步骤中,具体还包括:
类型单元:用于分析所述目标线程归属的类型;
指定单元:用于依据其归属的类型,指定与所述目标线程相对应的线程组;
监测单元:用于将预置的异常捕获器安置于所述线程组中并调用相关的关联函数监测所述目标线程的运行。
触发模块13:用于由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应。
本发明通过对目标线程进行栈回溯获取其执行首地址,再基于该执行首地址获得与其对应的线程路径,进而通过分析所述线程路径确认其对应目标线程是否为异常线程,而确定产生一个异常事件。其提高了异常检测的速率,另外还通过将所述线程路径与预设的异常路径库中的指向路径进行比较以判定其为异常路径的方式,保证了异常线程检测的准确度。
具体的,如图8所示结构框图,所述触发模块13包括以下单元:
栈回溯单元1004:用于获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址。
具体的,所述栈回溯单元1004包括以下子单元:
遍历子单元:用于遍历所述目标线程对应的栈基址;
回溯子单元:用于从所述栈基址开始,对所述目标线程进行栈回溯,获得所述目标线程的执行首地址。
具体的,所述栈回溯是指通过栈结构反向层层推导,获取保存在栈中某一层中的变量值。
具体的,所述遍历是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。另外的所述遍历也适合于多元素集合的情况,如数组。
假设以ExWorkerQueue[DelayedWorkQueue]工作队列为例,如果对该队列进行遍历,首先需要获得该工作队列中线程列表的头节点,本发明实施例中采用的C++代码如下:
Queue=&ExWorkerQueue[DelayedWorkQueue];
其中,Queue是一个变量,&为取地址运算符,上述代码行实现的是对ExWorkerQueue[DelayedWorkQueue]工作队列取首地址,即为该工作队列中线程列表的头节点地址。
从头节点地址开始,对ExWorkerQueue[DelayedWorkQueue]工作队列进行循环遍历,得到该工作队列中所有线程的栈基址。具体的实现方法可以是任何一种现有技术,本发明对此不作限制。
需要说明的是,该代码只是实现本发明实施例的一个方法,不能对本发明构成限制。
本发明实施例中,栈回溯是一个循环的过程,目标线程的执行首地址可以看做一个变量值,如果需要得到该执行首地址,必须对栈回溯设定一个终止的条件。
本发明实施例中,在变量扩展基址指针寄存器(ebp)中存放一个指针,该指针指向栈最上面一个栈帧的底部。在栈回溯的过程中,这个数值不断的发生变化,直到满足某个条件时,停止栈回溯。
本发明实施例中,以线程工厂提供的创建线程的函数假设为:PspCreateThreadStartup的内部地址的值来设定终止栈回溯的条件。线程工厂在创建与代码块相应的目标线程时,会调用PspSystemThreadStartup,该函数内部会使用目标线程的执行逻辑首地址。所以,在栈中值为该函数的内部偏移的地址附近,即保存了当前目标线程的执行首地址。因此,在函数PspSystemThreadStartup上加一个小的偏移量,便可以设定为终止栈回溯的条件。当ebp中的数值与该偏移量相等时,ebp-8处保存的整数便为当前目标线程的执行首地址。
需要说明的是,该终止条件只是实现本发明的其中一个条件,可以通过设立其他终止条件结束栈回溯的过程,本发明对此不作限制。
路径单元1005:用于根据所述首地址获得目标线程对应的线程路径。
本发明实施例中,每一个线程组模块均分配有相应的内存,每一条目标线程都有对应的线程组模块,该线程组模块中包含该线程的相关信息。如果能得到目标线程对应的线程组模块,便可以通过该线程组模块确定其对应的目标线程的线程路径。
本发明实施例中,利用预设的函数来获得线程组模块列表及其对应的内存范围。得到的目标线程的执行首地址匹配所得到的各个线程组模块的内存范围,如果所述执行首地址落在某个线程组模块的内存范围之内,该线程组模块就是所述执行首地址对应目标线程的模块,确定目标线程对应的线程组模块之后,可以通过读取该线程组模块中包含该线程的相关信息,得到目标线程对应的线程路径。
确定单元1006:用于分析获得的所述线程路径获取其对应的返回结果,当分析后得到的返回结果为空或为无效路径时,则确定所述线程路径对应的目标线程为异常线程,而确定产生一个异常事件。
本发明实施例中,根据获得的所述目标线程对应的线程路径,向该线程路径对应的线程组模板发送相应的查询指令,当接收到该线程组模块响应于所述查询指令而反馈的值为空值或无效路径值时,确认其对应的目标线程为异常线程。
具体的,本发明实施例中,当所述目标线程发生异常事件时,触发一个与之相应的异常捕获器运行,以产生由该异常捕获器的运行所定义的预设响应。
具体的,本发明实施例中,所述每个异常捕获器被配置为其运行适于定义如下任意一种或任意多种预设响应:
终止所述目标线程的运行而使所述线程池执行其线程序列中的下一线程;
控制所述线程工厂重启所述目标线程的运行;
向调用所述功能接口的调用行为返回异常代码或预设结果信息;
向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调。
另外的,本发明实施例中,所述控制所述线程工厂除了使重启所述目标线程的运行,还包括使所述目标线程执行终止指令或等待指令;其中所述终止指令用于激发终止信号,并将该终止信号发送至当前目标线程,该目标线程将退出到终止状态;所述等待指令用于激发等待信号,并将该等待信号发送至当前目标线程,直到其他线程唤醒处于等待状态的目标线程。
本发明实施例中,在确认目标线程是异常线程之后,进行后续处理,即产生由该异常捕获器的运行所定义的预设响应,还包括对所述异常线程执行挂起操作。
本发明实施例中,调用SDK系统提供的挂起目标线程的函数来对异常线程执行挂起操作。该函数以步骤S1031中得到的执行逻辑首地址作为参数,可以将对应的异常线程稳定的挂起。
需要说明的是,对异常线程的处理方法并不局限于本发明实施例提出的方法,还可以有其他方法,本发明对此不做限制。
本发明实施例中,由于已经将异常线程挂起或终止,可选的控制所述线程工厂重启所述目标线程的运行,另外将依据SDK提供的所述功能接口的调回指令,将异常线程对应的异常代码或者预设结果信息进行输出。其中所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
本发明通过调用SDK提供的功能接口向线程工厂提交代码块,以针对该代码块创建相关的目标线程,并建立该目标线程与设置了异常捕获器的线程组之间的关联,由线程组监控所述目标线程的运行,进而所述异常捕获器针对目标线程运行过程中出现的异常事件进行相应的处理,起到捕获线程运行异常以保护SDK正常工作的作用,在一定程度上提高了软件开发的速度,维持了应用的稳定性,进而保障整个软件开发的质量以及效率,提高产品的效果以及保证用户的使用体验。
请参阅附图9所示的一种SDK异常控制装置的一个实施例的结构框图,本发明所述一种SDK异常控制装置包括:
指向模块21:用于根据获得的线程路径,生成相应的用于指向预存的异常路径库的指向信息。
具体的,本发明实施例中,所述异常路径库根据历史线程发生异常事件时存储的与该线程对应的路径组成的数据库;或者根据云端数据构建而成。
本发明实施例中,所述指向信息指的是针对所述线程路径以获取预存的异常路径库的索引数据。通过所述索引数据获得与所述线程路径相应的异常路径库。
比较模块22:用于依据于所述指向信息,比较所述线程路径与所述指向信息对应于所述异常路径库的指向路径。
本发明实施例中,根据所述异常路径库中存储的历史异常数据中的指向路径,计算所述线程路径与所述指向路径之间的差异值,当在根据所述差异值预置的允许差异范围内,所述线程路径不与所述指向路径相同;当超出所述允许差异范围时,确定所述线程路径对应的目标线程为异常线程。
本发明实施例中,当所述线程路径不与所述指向路径相同时,包括以下后置可选单元:
重启单元:用于将释放所述目标线程,并调用相关的重启函数重新启动该目标线程。
需要说明的是,其中比较线程路径与指向路径的方法和重启目标线程的方法并不局限于本发明实施例提出的方法,还可以有其他方法,本发明对此不做限制。
判定模块23:用于当所述线程路径与所述异常路径库中的指向路径相同时,判定该线程路径为异常线程。
本发明实施例中,所述线程路径一旦被判定为所述异常线程,其将异常的线程路径次相应得路径信息存储记录于所述异常路径库中,其包括以下单元:
标识单元:用于依据判定结果获取所述异常的目标线程的线程路径对应的路径信息,并将生成与该路径信息相关的标识信息以用于标识该目标线程的线程路径;
添加单元:用于将所述路径信息添加至所述异常路径库中与所述标识信息相对应的位置。
本发明实施例中,通过建立的异常路径库提高了异常检测的精确度,以针对已知的异常事件进行处理并收集未知的异常路径,起到丰富该异常路径库的作用。
请参阅附图10所示的一种应用程序运行装置的一个实施例的结构框图,本发明所述一种应用程序运行装置包括:
调用模块31:用于调用SDK提供的功能接口以运行所述功能接口对应的目标线程。
本发明实施例中,所述运行功能接口对应的目标线程包括:在目标线程的Thread对象上调用start()方法;在调用start()方法之前,线程处于新状态中,其中所述新状态指有一个Thread对象,还没有一个真正的线程。
在调用start()方法之后,包括以下几种情况:
启动新的执行线程(具有新的调用栈);
该目标线程从新状态转移到可运行状态;
当该目标线程获得机会执行时,其目标run()方法将运行。
本发明实施例中,获取当前目标线程的对象的方法是:
Thread.currentThread();
其中,本发明实施例中,当线程目标run()方法结束时该目标线程完成。
处理模块32:用于响应该目标线程后的回调,处理与该目标线程运行相关结果,当所述相关结果为该目标线程经异常处理后返回的异常代码,输出告警信息或忽略所述相关结果;当所述相关结果为预设结果信息时,执行为该相关结果预设的处理模块。
具体的,所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
本发明实施例中,所述响应该目标线程后的回调,具体包括:
生成单元:用于当所述目标线程执行结束后将生成相关的执行结果;
获取单元:用于依据于该执行结果,获取针对SDK功能接口设定的回调请求;
回调单元:用于根据所述回调请求生成相对应的回调函数以回调其执行结果。
本发明实施例中,所述回调函数就是一个通过函数指针调用的函数。
其中,当函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,即为所述回调函数,如:
def getOddNumber(k,getEvenNumber);
return 1+getEvenNumber(k)
其中,所述回调函数用于针对异常事件或该异常事件对应产生的条件执行响应后的执行结果的回调。
其中,本发明实施例中,所述告警信息表示针对执行结果生成的关于所述异常事件的提示信息;其反映目标线程在执行过程中出现的异常事件以及该异常事件带来的效果。
可选的,本发明发明实施例中,以如下任意方式输出所述告警信息:
静默向预设接收者发送所述的异常代码;
向屏幕弹窗显示所述异常代码。
其中所述静默向预设接收者发送所述的异常代码,包括针对所述异常结果信息获取相对应的静默发送权限;依据于该静默发送权限生成相应的获取指令以获取所述异常代码及静默信息;接收所述异常代码并在所述静默发送权限的基础上发送所述异常代码。其中所述静默信息包括静默发送所述异常代码的路径信息和/或指令信息、所述接收者的地址信息和/或代称信息。所述静默发送权限的基础上,依据所述静默信息向接收者发送该异常代码。另外还包括所述静默向预设接收者发送所述的异常代码的步骤中包括的后置步骤:接收由接收者响应于所述异常代码而进行操作的处理指令,以根据该处理指令控制所述异常捕获器进行异常线程的处理工作。
其中所述向屏幕弹窗显示所述异常代码,包括依据于所述异常事件而执行的异常捕获或异常数据分析或异常线程重启,并发提取所述异常代码;根据提取的异常代码将其转换为可显示的图像信息以显示于所述屏幕弹窗中。本发明实施例中,所述异常代码的显示形式包括屏幕弹窗、界面显示框、单独显示界面、界面下拉栏等。
本发明实施例中,该应用程序的运行依据SDK提供的功能接口,对目标线程运行时出现的异常事件而产生的预设结果信息进行回调,以将异常代码发送至接收者或者显示于屏幕界面,具有时效性以及可控性。
相应的,本发明还提供一种终端设备,包括显示屏、存储器和一个或多个处理器,所述一个或多个处理器被配置用于执行SDK异常控制方法中的任意步骤,另外还应用了所述SDK异常控制装置任意模块或单元,在此不进行赘述。
总的来说,本发明通过调用SDK提供的功能接口向线程工厂提交代码块,以针对该代码块创建相关的目标线程,并建立该目标线程与设置了异常捕获器的线程组之间的关联,由线程组监控所述目标线程的运行,进而所述异常捕获器针对目标线程运行过程中出现的异常事件进行相应的处理,起到捕获线程运行异常以保护SDK正常工作的作用,在一定程度上提高了软件开发的速度,维持了应用的稳定性,进而保障整个软件开发的质量以及效率,提高产品的效果以及保证用户的使用体验。
另外,针对SDK被调用的功能接口判断其是否进行回调异常信息,进而通过文件存储、网络传输、日志打印的方式对异常信息进行分析,保证SDK的正常运行,降低了SDK的异常指数,并保证了软件的质量。
还有的,本发明通过对目标线程进行栈回溯获取其执行首地址,再基于该执行首地址获得与其对应的线程路径,进而通过分析所述线程路径确认其对应目标线程是否为异常线程,而确定产生一个异常事件。其提高了异常检测的速率,另外还通过将所述线程路径与预设的异常路径库中的指向路径进行比较以判定其为异常路径的方式,保证了异常线程检测的准确度。
综上所述,本发明在一定程度上提高了软件开发的速度,维持了应用的稳定性,进而保障整个软件开发的质量以及效率,提高产品的效果以及保证用户的使用体验。另外保证SDK的正常运行,降低了SDK的异常指数,并保证了软件的质量;而且还提高了异常检测的速率,保证异常线程检测的准确度。
在此处所提供的说明书中,虽然说明了大量的具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实施例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
虽然上面已经示出了本发明的一些示例性实施例,但是本领域的技术人员将理解,在不脱离本发明的原理或精神的情况下,可以对这些示例性实施例做出改变,本发明的范围由权利要求及其等同物限定。
Claims (27)
1.一种SDK异常控制方法,其特征在于,包括如下步骤:
判断调用该功能接口的调用行为是否需要回调,该功能接口为SDK中的应用程序接口;
当需要回调,调用同步队列进行目标线程运行结果等待;
向线程工厂提交被调用的功能接口相关的代码块;
由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联;
由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应;
其中,触发与该异常事件相应的异常捕获器执行预设响应包括:
通过该异常事件相应的异常捕获器向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调,该目标线程运行结果包括异常代码或预设结果信息。
2.根据权利要求1所述的方法,其特征在于,包括如下前置步骤:
当无需回调,直接执行后续步骤,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,正常结束所述目标线程的执行;和/或,当需要回调,在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,由该同步队列将该目标线程运行结果实施相应的回调。
3.根据权利要求1所述的方法,其特征在于,所述线程组包括多个异常捕获器,每个异常捕获器为该线程组的一个单元线程,多个异常捕获器用于分别响应不同的所述异常事件。
4.根据权利要求3所述的方法,其特征在于,当所述目标线程发生异常事件时,触发一个与之相应的异常捕获器运行,以产生由该异常捕获器的运行所定义的预设响应。
5.根据权利要求1所述的方法,其特征在于,所述每个异常捕获器被配置为其运行适于定义如下任意一种或任意多种预设响应:
终止所述目标线程的运行而使所述线程池执行其线程序列中的下一线程;
控制所述线程工厂重启所述目标线程的运行;
向调用所述功能接口的调用行为返回异常代码或预设结果信息;
向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调。
6.根据权利要求1所述的方法,其特征在于,由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应的步骤,包括以下步骤:
获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址;
根据所述首地址获得目标线程对应的线程路径;
分析获得的所述线程路径获取其对应的返回结果,当分析后得到的返回结果为空或为无效路径时,则确定所述线程路径对应的目标线程为异常线程,而确定产生一个异常事件。
7.根据权利要求6所述的方法,其特征在于,所述获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址,包括以下步骤:
遍历所述目标线程对应的栈基址;
从所述栈基址开始,对所述目标线程进行栈回溯,获得所述目标线程的执行首地址。
8.根据权利要求7所述的方法,其特征在于,所述栈回溯是指通过栈结构反向层层推导,获取保存在栈中某一层中的变量值。
9.根据权利要求6所述的方法,其特征在于,还包括以下步骤:
根据获得的线程路径,生成相应的用于指向预存的异常路径库的指向信息;
依据于所述指向信息,比较所述线程路径与所述指向信息对应于所述异常路径库的指向路径;
当所述线程路径与所述异常路径库中的指向路径相同时,判定该线程路径为异常线程。
10.根据权利要求9所述的方法,其特征在于,所述异常路径库根据历史线程发生异常事件时存储的与该线程对应的路径组成的数据库;或者根据云端数据构建而成。
11.一种应用程序运行方法,其特征在于,包括如下步骤:
调用SDK提供的功能接口以运行所述功能接口对应的目标线程;
判断调用所述功能接口的调用行为是否需要回调,所述功能接口为SDK中的应用程序接口;
当需要回调,响应该目标线程后的回调,调用同步队列进行该目标线程运行结果等待,处理与该目标线程运行相关结果,当所述相关结果为该目标线程经异常处理后返回的异常代码,输出告警信息或忽略所述相关结果;当所述相关结果为预设结果信息时,执行为该相关结果预设的处理模块。
12.根据权利要求11所述的方法,其特征在于,所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
13.根据权利要求11所述的方法,其特征在于,以如下任意方式输出所述告警信息:
静默向预设接收者发送所述的异常代码;
向屏幕弹窗显示所述异常代码。
14.一种SDK异常控制装置,其特征在于,包括:
提交模块:用于判断调用该功能接口的调用行为是否需要回调,该功能接口为SDK中的应用程序接口;当需要回调,调用同步队列进行目标线程运行结果等待;向线程工厂提交被调用的功能接口相关的代码块;
建立模块:用于由线程工厂为该代码块创建相应的目标线程,建立该目标线程与设置了用于捕获该目标线程的异常事件的异常捕获器的线程组之间的关联;
触发模块:用于由所述线程组监控被添加到线程池后的所述目标线程的运行,当该目标线程发生异常事件时,触发与该异常事件相应的异常捕获器执行预设响应;
其中,触发模块具体用于:通过该异常事件相应的异常捕获器向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调,该目标线程运行结果包括异常代码或预设结果信息。
15.根据权利要求14所述的装置,其特征在于,包括如下前置模块:
判断模块:用于判断调用该功能接口的调用行为是否需要回调,当无需回调,直接执行后续步骤,以在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,正常结束所述目标线程的执行;和/或,当需要回调,在所述线程组未监控到目标线程运行过程中产生的所述异常事件时,由该同步队列将该目标线程运行结果实施相应的回调。
16.根据权利要求14所述的装置,其特征在于,所述线程组包括多个异常捕获器,每个异常捕获器为该线程组的一个单元线程,多个异常捕获器用于分别响应不同的所述异常事件。
17.根据权利要求16所述的装置,其特征在于,当所述目标线程发生异常事件时,触发一个与之相应的异常捕获器运行,以产生由该异常捕获器的运行所定义的预设响应。
18.根据权利要求14所述的装置,其特征在于,所述每个异常捕获器被配置为其运行适于定义如下任意一种或任意多种预设响应:
终止所述目标线程的运行而使所述线程池执行其线程序列中的下一线程;
控制所述线程工厂重启所述目标线程的运行;
向调用所述功能接口的调用行为返回异常代码或预设结果信息;
向同步队列返回异常代码或预设结果信息以由该同步队列对所述功能接口的调用行为实施回调。
19.根据权利要求14所述的装置,其特征在于,所述触发模块包括以下单元:
栈回溯单元:用于获取当前正在运行的目标线程,针对所述目标线程进行栈回溯以获取该目标线程的执行首地址;
路径单元:用于根据所述首地址获得目标线程对应的线程路径;
确定单元:用于分析获得的所述线程路径获取其对应的返回结果,当分析后得到的返回结果为空或为无效路径时,则确定所述线程路径对应的目标线程为异常线程,而确定产生一个异常事件。
20.根据权利要求19所述的装置,其特征在于,所述栈回溯单元包括以下子单元:
遍历子单元:用于遍历所述目标线程对应的栈基址;
回溯子单元:用于从所述栈基址开始,对所述目标线程进行栈回溯,获得所述目标线程的执行首地址。
21.根据权利要求20所述的装置,其特征在于,所述栈回溯是指通过栈结构反向层层推导,获取保存在栈中某一层中的变量值。
22.根据权利要求19所述的装置,其特征在于,还包括:
指向模块:用于根据获得的线程路径,生成相应的用于指向预存的异常路径库的指向信息;
比较模块:用于依据于所述指向信息,比较所述线程路径与所述指向信息对应于所述异常路径库的指向路径;
判定模块:用于当所述线程路径与所述异常路径库中的指向路径相同时,判定该线程路径为异常线程。
23.根据权利要求22所述的装置,其特征在于,所述异常路径库根据历史线程发生异常事件时存储的与该线程对应的路径组成的数据库;或者根据云端数据构建而成。
24.一种应用程序运行装置,其特征在于,包括:
调用模块:用于调用SDK提供的功能接口以运行所述功能接口对应的目标线程;
处理模块:用于判断调用所述功能接口的调用行为是否需要回调,所述功能接口为SDK中的应用程序接口;当需要回调,响应该目标线程后的回调,调用同步队列进行该目标线程运行结果等待,处理与该目标线程运行相关结果,当所述相关结果为该目标线程经异常处理后返回的异常代码,输出告警信息或忽略所述相关结果;当所述相关结果为预设结果信息时,执行为该相关结果预设的处理模块。
25.根据权利要求24所述的装置,其特征在于,所述预设结果信息包括目标线程运行中出现的异常事件对应的空值或者无效路径信息。
26.根据权利要求24所述的装置,其特征在于,以如下任意方式输出所述告警信息:
静默向预设接收者发送所述的异常代码;
向屏幕弹窗显示所述异常代码。
27.一种终端设备,其特征在于:
包括显示屏、存储器和一个或多个处理器,所述一个或多个处理器被配置用于执行权利要求1-13任意一项所述方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611236170.5A CN108255585B (zh) | 2016-12-28 | 2016-12-28 | Sdk异常控制及应用程序运行方法、装置及其设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611236170.5A CN108255585B (zh) | 2016-12-28 | 2016-12-28 | Sdk异常控制及应用程序运行方法、装置及其设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108255585A CN108255585A (zh) | 2018-07-06 |
CN108255585B true CN108255585B (zh) | 2023-08-18 |
Family
ID=62720256
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611236170.5A Active CN108255585B (zh) | 2016-12-28 | 2016-12-28 | Sdk异常控制及应用程序运行方法、装置及其设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108255585B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109597703A (zh) * | 2018-12-05 | 2019-04-09 | 广州华多网络科技有限公司 | 一种软件开发工具包崩溃的处理方法、装置及设备 |
CN110362475A (zh) * | 2019-06-17 | 2019-10-22 | 北京奇艺世纪科技有限公司 | 一种信息获取方法、装置、终端设备及存储介质 |
CN112395593B (zh) * | 2019-08-15 | 2024-03-29 | 奇安信安全技术(珠海)有限公司 | 指令执行序列的监测方法及装置、存储介质、计算机设备 |
CN111857779B (zh) * | 2020-07-20 | 2024-04-12 | 深圳市欢太科技有限公司 | 信息处理方法、装置、电子设备及存储介质 |
CN112469065A (zh) * | 2020-12-23 | 2021-03-09 | 北京春笛网络信息技术服务有限公司 | 一种5g短信一体机的保活检测方法 |
CN113704088B (zh) * | 2021-07-21 | 2023-09-12 | 郑州云海信息技术有限公司 | 一种进程追溯方法、进程追溯系统及相关装置 |
CN117311912B (zh) * | 2023-11-30 | 2024-02-02 | 成都融见软件科技有限公司 | 一种基于交互调试的数据交互方法、存储介质及电子设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101794243A (zh) * | 2010-03-18 | 2010-08-04 | 浪潮电子信息产业股份有限公司 | 一种利用操作系统结构化异常处理加固java应用程序的方法 |
CN103019806A (zh) * | 2011-09-22 | 2013-04-03 | 北京新媒传信科技有限公司 | 一种异步任务处理方法和装置 |
CN103164256A (zh) * | 2011-12-08 | 2013-06-19 | 深圳市快播科技有限公司 | 一种实现单机支持高并发处理方法及系统 |
CN103593236A (zh) * | 2013-11-14 | 2014-02-19 | 华为技术有限公司 | 一种业务流程调度的计算机设备、方法和装置 |
CN103839007A (zh) * | 2014-03-03 | 2014-06-04 | 珠海市君天电子科技有限公司 | 一种检测异常线程的方法及系统 |
CN104503770A (zh) * | 2015-01-12 | 2015-04-08 | 北京国双科技有限公司 | 异常信息的处理方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7249355B2 (en) * | 2002-12-18 | 2007-07-24 | Microsoft Corporation | Unified network thread management |
US20090172636A1 (en) * | 2006-03-31 | 2009-07-02 | Tim Griffith | Interactive development tool and debugger for web services |
-
2016
- 2016-12-28 CN CN201611236170.5A patent/CN108255585B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101794243A (zh) * | 2010-03-18 | 2010-08-04 | 浪潮电子信息产业股份有限公司 | 一种利用操作系统结构化异常处理加固java应用程序的方法 |
CN103019806A (zh) * | 2011-09-22 | 2013-04-03 | 北京新媒传信科技有限公司 | 一种异步任务处理方法和装置 |
CN103164256A (zh) * | 2011-12-08 | 2013-06-19 | 深圳市快播科技有限公司 | 一种实现单机支持高并发处理方法及系统 |
CN103593236A (zh) * | 2013-11-14 | 2014-02-19 | 华为技术有限公司 | 一种业务流程调度的计算机设备、方法和装置 |
CN103839007A (zh) * | 2014-03-03 | 2014-06-04 | 珠海市君天电子科技有限公司 | 一种检测异常线程的方法及系统 |
CN104503770A (zh) * | 2015-01-12 | 2015-04-08 | 北京国双科技有限公司 | 异常信息的处理方法及装置 |
Non-Patent Citations (1)
Title |
---|
How do API Changes Trigger Stack Overflow Discussions? A Study on the Android SDK;M Linares-Vasquez等;22nd IEEE International Conference on Program Comprehension(ICPC’14);第83-94页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108255585A (zh) | 2018-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108255585B (zh) | Sdk异常控制及应用程序运行方法、装置及其设备 | |
CN111142867B (zh) | 微服务架构下的服务可视化编排系统及方法 | |
US10884808B2 (en) | Edge computing platform | |
CN109523187B (zh) | 任务调度方法、装置和设备 | |
US9501319B2 (en) | Method and apparatus for scheduling blocking tasks | |
WO2014179635A1 (en) | Activity based sampling of diagnostics data | |
US20140156849A1 (en) | Map-reduce workflow processing apparatus and method, and storage media storing the same | |
US20130159062A1 (en) | Process-driven composite application architecture | |
CN103645909A (zh) | 定时任务的处理方法及装置 | |
US20200117504A1 (en) | Evolutionary modelling based non-disruptive scheduling and management of computation jobs | |
JP2011118879A (ja) | ユーザインタフェース操作の位置独立な実行 | |
CN107526623B (zh) | 一种数据处理方法及装置 | |
CN111061551A (zh) | 节点的合并调度方法、装置、设备及存储介质 | |
CN103729257A (zh) | 一种分布式并行计算方法以及系统 | |
CN104536819A (zh) | 基于web服务的任务调度方法 | |
CN102420709A (zh) | 一种基于任务框架的调度任务管理方法和设备 | |
WO2022228156A1 (zh) | 一种策略编排处理方法、装置、设备、系统及存储介质 | |
US20240311179A1 (en) | Workflow processing method, electronic device, and storage medium | |
CN114357029B (zh) | 业务数据的处理方法、装置、设备及介质 | |
CN112558968A (zh) | 一种资源树视图的生成方法、装置、设备及存储介质 | |
CN102281584A (zh) | 一种物联网能力的实现方法及系统 | |
CN113051173B (zh) | 测试流程的编排执行方法、装置、计算机设备和存储介质 | |
CN113268332B (zh) | 持续集成方法及装置 | |
CN111431892B (zh) | 一种加速器管理架构、方法及加速器接口控制器 | |
CN114564249A (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 | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20230728 Address after: 300450 No. 9-3-401, No. 39, Gaoxin 6th Road, Binhai Science Park, Binhai New Area, Tianjin Applicant after: 3600 Technology Group Co.,Ltd. Address before: 100088 room 112, block D, 28 new street, new street, Xicheng District, Beijing (Desheng Park) Applicant before: BEIJING QIHOO TECHNOLOGY Co.,Ltd. |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |