应用程序的故障排查方法及装置与流程
未命名
08-01
阅读:112
评论:0

1.本说明书涉及计算机技术领域,特别涉及一种应用程序的故障排查方法。本说明书同时涉及一种应用程序的故障排查装置,一种计算设备,以及一种计算机可读存储介质。
背景技术:
2.随着计算机技术的快速发展,诞生了越来越多的应用程序,受网络环境、配置选择、用户标准和测试局限性等影响,在应用程序的运行过程中,不可避免的会出现故障,进而产生诸多线上问题,因而需要及时排查应用程序出现的故障。
3.现有技术中,用户在使用应用程序的过程中出现故障,往往是用户详细描述自己的操作和出现的故障,提交故障报告,然后由工作人员根据用户的描述排查故障;或者,工作人员还可以提前预想出调试时需要知道的信息,并将日志埋入到应用程序的代码中,当用户报告故障的时候,通过分析日志排查故障。
4.然而,上述方法中,用户很难描述清楚他所做过的操作和出现的具体故障,工作人员也很难根据模糊的描述排查出具体的故障;另外,代码中埋入大量日志,会拖慢应用程序的响应速度,海量日志也难以保存,难以准确快速地定位出准确的故障,应用程序的故障排查准确率和效率较低。因此,亟需提供一种准确高效地排查应用程序故障的操作或者处理。
技术实现要素:
5.有鉴于此,本说明书实施例提供了一种应用程序的故障排查方法。本说明书同时涉及一种应用程序的故障排查装置,一种计算设备,以及一种计算机可读存储介质,以解决现有技术中存在的技术缺陷。
6.根据本说明书实施例的第一方面,提供了一种应用程序的故障排查方法,包括:
7.在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,目标应用程序的代码包括第一类型代码和第二类型代码,数据传输通道用于实现目标应用程序中第一类型代码和第二类型代码之间的函数调用;
8.若检测到目标应用程序的故障报告指令,则获取目标应用程序对应的历史录制信息;
9.根据历史录制信息中的历史调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,其中,回放的执行数据用于确定目标应用程序的故障原因。
10.根据本说明书实施例的第二方面,提供了一种应用程序的故障排查装置,包括:
11.录制模块,被配置为在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,目标应用程序的代码包括第一类型代码和第二类型代码,数据传输通道用于实现目标应用程序中第一类型代码和第二类型代码之间的函数调用;
12.获取模块,被配置为若检测到目标应用程序的故障报告指令,则获取目标应用程序对应的历史录制信息;
13.回放模块,被配置为根据历史录制信息中的历史调用参数,执行目标应用程序的
代码,回放目标应用程序的执行数据,其中,回放的执行数据用于确定目标应用程序的故障原因。
14.根据本说明书实施例的第三方面,提供了一种计算设备,包括:
15.存储器和处理器;
16.存储器用于存储计算机可执行指令,处理器用于执行计算机可执行指令,以实现上述的应用程序的故障排查方法的步骤。
17.根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该指令被处理器执行时实现上述的应用程序的故障排查方法的步骤。
18.本说明书实施例提供的应用程序的故障排查方法,在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,目标应用程序的代码包括第一类型代码和第二类型代码,数据传输通道用于实现目标应用程序中第一类型代码和第二类型代码之间的函数调用;若检测到目标应用程序的故障报告指令,则获取目标应用程序对应的历史录制信息;根据历史录制信息中的历史调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,其中,回放的执行数据用于确定目标应用程序的故障原因。
19.这种情况下,在目标应用程序的运行过程中,可以对目标应用程序中第一类型代码和第二类型代码之间函数调用的数据传输通道上的调用参数进行录制,该调用参数可以反映用户在目标应用程序中所执行的操作,因而在目标应用程序出现故障时,可以直接基于之前运行过程中录制的历史调用参数,重新执行目标应用程序的代码,回放目标应用程序的执行数据,回放执行数据的过程会重现目标应用程序的运行画面,从而无需录制目标应用程序的运行画面,结合目标应用程序的执行数据和重现的运行画面,工作人员可以确定出目标应用程序的故障原因,提供目标应用程序的故障原因排查准确率和效率。
附图说明
20.图1是本说明书一实施例提供的一种应用程序的故障排查方法的流程图;
21.图2a是本说明书一实施例提供的一种webassembly和javascript之间数据传输通道的示意图;
22.图2b是本说明一实施例提供的一种调用参数的录制流程图;
23.图2c是本说明一是实施例提供的一种历史录制信息中调用参数的遍历过程示意图;
24.图3是本说明书一实施例提供的一种应用于浏览器场景的应用程序的故障排查方法的处理流程图;
25.图4是本说明书一实施例提供的一种应用程序的故障排查装置的结构示意图;
26.图5是本说明书一实施例提供的一种计算设备的结构框图。
具体实施方式
27.在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。
28.在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,
而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
29.应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
30.首先,对本说明书一个或多个实施例涉及的名词术语进行解释。
31.webassembly:简称wasm,是一个虚拟指令集体系架构(virtual isa),整体架构包括核心的isa定义、二进制编码、程序语义的定义与执行,以及面向不同的嵌入环境(如web)的应用编程接口(webassemblyapi)。其初始目标是为c/c++等语言编写的程序经过编译,在确保安全和接近原生应用的运行速度更好地在web平台上运行。webassembly是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果,它设计的目的不是为了手写代码,而是为诸如c、c++和rust等低级源语言提供一个高效的编译目标。
32.javascript:缩写为js,是一种高级的、多范式、解释型的编程语言,是一门基于原型、函数先行的语言,它支持面向对象编程、命令式编程以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式,不支持i/o(比如网络、存储和图形等),但可以由它的宿主环境提供支持,已经实现语言的标准化,被世界上的绝大多数网站所使用,也被世界主流浏览器支持。
33.c语言:后续内容简称c,是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。c语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。c语言编译器普遍存在于各种不同的操作系统中。
34.需要说明的是,受网络环境、配置选择、用户标准和测试局限性等影响,在应用程序的运行过程中,不可避免的会出现故障,进而产生诸多线上问题,因而需要及时排查应用程序出现的故障。
35.实际实现时,使用webassembly编写的复杂应用程序需要处理复杂的输入和内部状态,当用户向工作人员报告了一个故障的时候,很难描述清楚他所做过的操作,工作人员也很难根据模糊的描述重建出故障发生时应用程序的内部状态。往往工作人员为了避免难以定位故障,需要提前预想出调试时需要知道的信息,并把日志埋入到代码里,但是大量的日志会拖慢应用程序响应用户输入的速度,且海量的日志在用户的终端上也难以存储。
36.一种可能的实现方式中,可以通过录制用户的输入来代替手写的日志,比如rrweb(一个实现web页面录制和回放的基础库,它可以将页面中的dom以及用户操作保存为可序列化的数据,以实现远程回放),录制了用户的键盘和鼠标输入,也录制了给浏览器的输出,也就是html/dom的更新。这份input/output的录制文件可以供工作人员观看,比视频录制文件尺寸更小,也提供更多的信息给工作人员。
37.然而,工作人员观看rrweb的回放和观看录制的视频并没有特别本质的区别,只能观察到表面的现象,并不能观察到应用内部的状态变量。并且,录制html/dom数据量是比较
大的。再者,其他的输出,例如canvas/webgl的绘制,因为数据量比html/dom大,出于成本考虑往往不录制,或者降低录制的采样率或者分辨率。
38.因而,本说明书实施例提供了一种应用程序的故障排查方案,实现低成本的全天候全量io(input/output,输入/输出)录制,用户报告故障的时候附带上io录制文件。工作人员可以执行应用程序对应版本的代码去回放io录制文件,重建出应用程序的内部状态来定位故障原因。
39.在本说明书中,提供了一种应用程序的故障排查方法,本说明书同时涉及一种应用程序的故障排查装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
40.图1示出了根据本说明书一实施例提供的一种应用程序的故障排查方法的流程图,应用于应用程序管理平台,该应用程序管理平台可以供用户运行应用程序,也可以供工作人员重新执行应用程序的代码,回放录制的调用参数,定位故障原因,该应用程序管理平台可以为客户端、服务器或者网页,具体包括以下步骤102-106:
41.步骤102:在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,目标应用程序的代码包括第一类型代码和第二类型代码,数据传输通道用于实现目标应用程序中第一类型代码和第二类型代码之间的函数调用。
42.具体的,目标应用程序为用户当前使用的应用程序,该目标应用程序为webassembly代码环境对应的应用程序,如浏览器应用,webassembly存在清晰的i/o边界,便于对目标应用程序的i/o参数进行全量录制,从而在报告故障时,通过录制的i/o参数执行目标应用程序的代码,准确高效地回放定位故障原因。
43.需要说明的是,数据传输通道为目标应用程序中第一类型代码和第二类型代码之间函数调用的通信信道,第一类型代码为webassembly,第二类型代码为javascript,也即该目标应用程序包括webassembly和javascript两种类型的代码。由于目标应用程序中webassembly没有获取用户输入/输出的能力,输入/输出参数都需要从javascript侧获得,webassembly依赖javascript提供输入/输出参数,webassembly标准是表达力比较弱的一种通信方式,调用一个函数能够传递的值是简单的类型,比如int类型的值,无法传递比较复杂的结构体,如用户输入的账户密码等复杂数据。因而,在webassembly和javascript之间预先配置了统一的数据传输通道,目标应用程序运行过程中,可以通过该统一规范的数据传输通道可以实现webassembly和javascript之间存在函数调用,通过webassembly支持传递复杂类型做为参数和返回值。
44.实际应用中,可以预先配置应用程序中webassembly和javascript之间规范的数据传输通道,也即统一目标应用程序中webassembly和javascript之间的通信信道。在目标应用程序的运行过程中,用户在目标应用程序中执行的操作,通过webassembly和javascript之间的函数调用实现,而函数调用需要经过预先配置的数据传输通道,对数据传输通道上的调用参数进行录制,即是对用户在目标应用程序中执行操作的相关信息进行录制,也即对目标应用程序的输入/输出参数进行录制。
45.本实施例一个可选的实施方式中,可以预先规范webassembly和javascript之间的数据传输通道,也即目标应用程序中第一类型代码和第二类型代码之间的数据传输通道通过如下方式配置:
46.将目标应用程序的代码中第一类型代码调用第二类型代码的调用位置处修改为调用第一函数;
47.将目标应用程序的代码中第二类型代码调用第一类型代码的调用位置处修改为调用第二函数;
48.其中,第一函数和第二函数为预先封装的、用于录制函数调用过程的调用参数的函数。
49.实际应用中,webassembly规范和javascript引擎对webassembly规范的实现,支持webassembly调用javascript的函数,也支持javascript调用webassembly函数。使用emscripten编译器,用c语言编写webassembly调用javascript的代码示例如下:
[0050][0051]
其中,window.alert是javascript的函数,alert是html/dom中用到的一种脚本语言,它的中文意思是“提醒,是javascript脚本语言中窗口window对象的一个常用方法,其主要用法就是在定义了一定的函数以后,通过执行相应的操作,弹出对话框的语言,并且alert对话框通常用于一些对用户的提示信息,因而window.alert的功能是在应用程序中弹出一个对话框。c里面本身并没有window,也没有window.alert函数,为了使得c可以弹出对话框,需要将javascript提供的window.alert函数包装成c可以调用的函数,因而封装了一个call_alert函数,通过em_js把封装的call_alert提供给c,也即call_alert是c可以调用的窗口函数。也即是说,em_js是封装的可以录制函数的调用参数的代码。
[0052]
需要说明的是,上述是基于弹出对话框功能的举例说明,也即将javascript提供的window.alert函数包装成c可以调用的call_alert函数是举例说明,具体实现时,c需要的与用户交互相关的函数功能、但其本身不存在对应的功能函数的情况下,均可以将javascript中提供的函数封装成c可以调用的函数,通过em_js提供给c。也即是说,可以实现统一的jscall机制,该jscall机制统一webassembly和javascript之间的数据传输通道,以实现复杂类型结构体的序列化,也即webassembly需要对输入的复杂结构体进行序列化,获得二进制数组,然后传递给javascript,javascript再进行反序列化。
[0053]
具体实现时,该统一的jscall机制用于有一个统一的一处函数来添加录制的代码,且支持传递复杂类型做为参数和返回值。具体实现时em_js可以如下:
[0054]
em_js(const char*,js_call,(jscallcode method,const char*argptr),{
[0055]
return window.jscall(method,argptr》》》0);
[0056]
})
[0057]
其中,jscall中jscallcode是个枚举常量,用于标识封装获得的函数,从而区分当前调用的jscall对应的哪个函数,作为相应的调用参数的数组下标,相当于封装的函数标识,每添加一种封装的函数,也即每添加一种jscall需要新增一个常量定义。
[0058]
实际应用中,在调用函数时,可以确定该函数的method是否存在于枚举常量jscallcode的methodcode中,如果存在可以找到对应的函数,不存在则报错,说明之前未封装过相应的函数。例如,除了上述对弹出对话框的window.alert函数封装获得的call_alert函数外,还可以对展示购物车的函数封装获得对应的c可调用的函数2,此时methodcode包括两个枚举常量,如分别为1和2,其中1标识call_alert函数,2标识函数2。
[0059]
另外,argptr是对复杂结构体进行序列化获得的二进制参数,如复杂结构体为用户输入的信息或者执行的操作,例如该复杂结构体可以为用户输入的账户名和密码,也即argptr为需要录制的用户输入。window.jscall是在javascript侧写的一个函数,其返回值类型也是二进制序列化的,其作用为实现能够全局访问到window,类似于全局变量,实现函数的访问。
[0060]
目标应用程序的部分代码示例如下:
[0061][0062][0063]
实际应用中,通过把所有webassembly调用javascript的调用处都修改为调用js_call,可以在window.jscall上录制到所有的调用参数。该js_call即为第一函数,通过定义c中的方法,实现javascript侧函数的调用。也即是说,规定的一种webassembly调用javascript的规范,通过这种规范,可以录制webassembly调用javascript的各个调用参数。
[0064]
另外,javascript调用webassembly,用emscripten编译,用c编写,代码示例如下:
[0065]
void emscripten_keepalive my_function(){
[0066]
printf("i am being kept alive\n");
[0067]
}
[0068]
//在javascript侧,使loadedmodule.my_function()可以调用到c导出的函数。
[0069]
需要说明的是,基于emscripten_keepalive,类似于上述的em_js,也可以封装出统一的wasmcall机制,代码示例如下:
[0070][0071]
其中,wasmcallcode类似于jscallcode,也是一个预定义的枚举常量。在javascript侧可以再封装一个wasmcall函数用于录制。具体的,wasmcall函数代码示例如下:
[0072][0073]
实际应用中,改写javascript调用webassembly的调用处,调用wasmcall就可以录制下来各个调用参数。该wasmcall即为第二函数。也即是说,规定的一种javascript调用webassembly的规范,通过这种规范,可以录制javascript调用webassembly的各个调用参数。
[0074]
需要说明的是,通过将目标应用程序的代码中webassembly调用javascript的调用位置处修改为调用js_call,将javascript调用webassembly的调用位置处修改为调用wasmcall,可以把webassembly和javascript之间的通信做了入口上的统一,webassembly调用javascript需要通过jscall,javascript调用webassembly需要通过wasmcall,从而实现对webassembly和javascript之间函数调用的相关调用参数进行录制。如此,构建了规范的webassembly和javascript之间的数据传输通道,对该数据传输通道上的调用参数进行录制,从而有一个统一的序列化格式和录制规范,录制无需额外把应用内的状态序列化成
可持久化的字节数组,只需录制调用参数,比录制html/dom数据量更小,极大减少了序列化引起的内存和cpu(central processing unit,中央处理器)开销。
[0075]
示例的,图2a是本说明书一实施例提供的一种webassembly和javascript之间数据传输通道的示意图,如图2a所示,webassembly中封装的js_call函数可以调用javascript中jscall函数,该jscall函数可以包括js函数1、js函数
…
、js函数n,如window.alert函数为一个js函数。javascript中封装的wasmcall函数,可以调用webassembly中的wasm_call函数,该wasm_cal函数可以包括c函数1、c函数
…
、c函数n。
[0076]
本实施例一个可选的实施方式中,统一webassembly和javascript之间数据传输通道后,在目标应用程序的运行过程中,可以对数据传输通道上的调用参数进行录制,从而记录用户在目标应用程序中执行的操作信息,对数据传输通道上的调用参数进行录制,具体实现过程可以如下:
[0077]
通过第一函数录制第一类型代码调用第二类型代码的第一调用参数,并通过第二函数录制第二类型代码调用第一类型代码的第二调用参数。
[0078]
具体实现时,第一函数是指js_call函数,第二函数是指wasmcall函数。
[0079]
需要说明的是,通过将目标应用程序的代码中webassembly调用javascript的调用位置处修改为调用js_call,将javascript调用webassembly的调用位置处修改为调用wasmcall,可以把webassembly和javascript之间的通信做了入口上的统一,目标应用程序的运行过程中,webassembly调用javascript会通过第一函数js_call,javascript调用webassembly会通过第二函数wasmcall,因而可以通过第一函数录制第一类型代码调用第二类型代码的第一调用参数,并通过第二函数录制第二类型代码调用第一类型代码的第二调用参数,录制的调用参数即为用户在目标应用程序中执行的操作信息,后续在目标应用程序发生故障时,仅需回放录制的调用参数,就可以在与线上相同的运行环境中重新执行代码,复现用户的操作,以准确高效地定位故障问题。
[0080]
本实施例一个可选的实施方式中,通过第一函数录制第一类型代码调用第二类型代码的第一调用参数,具体实现过程可以如下:
[0081]
获取第一输入信息,并对第一输入信息进行序列化,获得对应的第一函数参数;
[0082]
根据第一函数参数执行第一函数,获得并录制第一函数的返回值。
[0083]
具体的,第一输入信息是指用户在目标应用程序中输入、用于调用javascrip中函数的信息,如用户的账号名、密码等。该返回值是指执行第一函数javascrip返回的用户的输入信息,比如webassembly询问javascrip用户刚刚输入了什么,javascrip返回用户输入的账户密码,该账户密码即返回值。
[0084]
需要说明的是,对于webassembly来说有录制价值的input/output是第一函数(js_call)的返回值,第一函数(js_call)的函数参数是由执行webassembly代码产生的,可以在回放过程通过执行webassembly代码复现,无需录制,因而在调用第一函数的过程中录制第一函数的返回值即可。
[0085]
另外,为了实现input/output的全量录制,需要避免因为录制对应用程序响应gui(graphical user interface,图形用户接口)速度产生影响,尤其是对input/output序列化需要尽可能减少cpu的消耗。
[0086]
因而,具体实现时,对应的第一函数(js_call)的录制方案可以为:c代码在调用
js_call之前,用protobuf序列化协议把c结构体序列化为二进制的字节数组,其中,protobuf序列化协议是一款无关平台、无关语言、可扩展、轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构,所以很适合做数据存储和为不同语言、不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过protobuf序列化的数据;c结构体是指用户输入的信息,如用户登录应用程序时输入的账号密码。
[0087]
然后,把序列化结果做为js_call的函数参数,调用js_call,c的js_call调用javascript的jscall,在jscall中,调用对应jscallcode的js函数实现,对应jscallcode的js函数实现把返回值中的javascript对象用protobuf序列化成二进制的字节数组,返回值给jscall。在jscall中,额外拷贝一份jscallcode和序列化后的返回值,称之为bridgecall。
[0088]
本说明书实施例中,可以录制执行第一函数的返回值,如应用程序向用户展示是否确定购买的控件,用户点击确认,此时用户的点击操作即为第一函数的返回值,第一函数的返回值作为调用参数进行录制,该调用操作可以指示用户在目标应用程序中的操作信息,后续可以通过回放调用参数,准确高效地定位故障原因。
[0089]
本实施例一个可选的实施方式中,通过第二函数录制第二类型代码调用第一类型代码的第二调用参数,具体实现过程可以如下:
[0090]
获取第二输入信息,并对第二输入信息进行序列化,获得对应的第二函数参数;
[0091]
将第二函数参数作为第二函数的输入参数,调用第二函数,并录制函数参数。
[0092]
需要说明的是,对于webassembly来说有录制价值的input/output是第二函数(wasmcall)的函数参数,而第二函数(wasmcall)的返回值都是由执行webassembly代码产生的,可以在回放过程通过执行webassembly代码复现,无需录制,因而在调用第二函数的过程中录制第二函数的函数参数即可。
[0093]
具体实现时,对应的第二函数(wasmcall)录制方案可以为:javascript代码在调用wasmcall之前,用protobuf序列化协议把javascript对象序列化为二进制的字节数组。其中,javascript对象为用户操作对象的属性信息,如用户购买一个商品,该javascript对象可以为商品的属性信息。也即,函数参数为用户购买的商品的属性信息。实际实现时,也可以采用其他序列化协议进行序列化。
[0094]
然后,把序列化结果做为wasmcall的函数参数,调用wasmcall,在wasmcall中,额外拷贝一份wasmcallcode和序列化后的函数参数,称之为bridgecall。
[0095]
作为一种示例,保存的bridgecall对应的序列化后数据格式可以如下:
[0096]
[0097]
[0098][0099]
本说明书实施例中,可以录制调用第二函数的函数参数,如用户在应用程序中购买某商品,该函数参数为该商品的属性信息,用于调用对应的第二函数,第二函数的函数参数作为调用参数进行录制,该调用操作可以指示用户在目标应用程序中的操作信息,后续可以通过回放调用参数,准确高效地定位故障原因。
[0100]
本实施例一个可选的实施方式中,录制的调用参数可以进行存储,也即对数据传输通道上的调用参数进行录制之后,还包括:
[0101]
在第二类型代码的全局变量中记录目标应用程序当前会话对应的存储位置标识,并根据存储位置标识对录制的调用参数进行存储。
[0102]
具体的,目标应用程序中可能会包括多个会话,不同会话之间可以切换,为了避免录制的调用参数混乱,可以针对各个会话分配对应的存储位置标识,该存储位置标识可以是指数据库标识,即一个会话的调用参数存储至一个数据库中;该存储位置标识也可以是指数据库中的存储块标识,也即各个会话的调用参数存储至同一数据库中。或者,也可以结合数据库标识和存储块标识限定当前会话的调用参数对应的存储位置。
[0103]
需要说明的是,开启应用程序的某个会话后,可以对运行过程中数据传输通道上的调用参数进行录制。假定用户在每个应用程序中只能有一个正在编辑的任务,称之为一个会话,在对目标应用程序的当前会话的调用参数进行存储时,可以基于当前会话对应的存储位置标识进行存储,当用户需要反馈当前会话的故障时,只需要提取目标应用程序的当前会话所对应的录制文件即可,操作简单便捷。
[0104]
实际应用中,目标应用程序启动后,会话被打开时,执行javascript代码,javascript代码在全局变量中记录目标应用程序当前会话对应的存储位置标识,将针对当前会话录制的调用参数存储至该存储位置标识对应的目标存储位置处。
[0105]
本实施例一个可选的实施方式中,根据存储位置标识对录制的调用参数进行存储,具体实现过程可以如下:
[0106]
确定目标队列是否超过长度限制,其中,目标队列为存储目标应用程序的调用参数的队列;
[0107]
在目标队列未超过长度限制的情况下,将调用参数存储至目标队列中;
[0108]
异步消费目标队列,将目标队列存储至存储位置标识对应的目标存储位置。
[0109]
需要说明的是,录制获得调用参数bridgecall后,可以将调用参数bridgecall拷贝至一个限制长度的目标队列bridgecalls中,如果目标队列超过长度限制则丢弃,避免队列过长,否则进行拷贝。该调用参数bridgecall包括录制的第一函数(js_call)的返回值和第二函数(wasmcall)的函数参数,各个数值按照时序排列。
[0110]
然后,异步的savebridgecall javascript协程消费该目标队列bridgecalls,把调用参数bridgecall保存到存储位置标识对应的目标存储位置处,如浏览器提供的indexeddb数据库中。如此,异步消费目标队列bridgecalls,从而保证将录制的调用参数
bridgecall持久化到磁盘时,异步的磁盘i/o操作,降低内存消耗。
[0111]
示例的,图2b是本说明一实施例提供的一种调用参数的录制流程图,如图2b所示,第一函数(js_call)的返回值和第二函数(wasmcall)的函数参数按照时序依次加入至限长队列bridgecalls中,然后异步的savebridgecall javascript协程,消费该限长队列bridgecalls,写入对应的数据库indexeddb中。
[0112]
步骤104:若检测到目标应用程序的故障报告指令,则获取目标应用程序对应的历史录制信息。
[0113]
需要说明的是,用户需要反馈目标应用程序出现的故障时,应用程序管理平台可以检测到故障报告指令,如webassembly代码抛出异常的时候,应用程序管理平台可以检测到故障报告指令。
[0114]
实际应用中,检测到目标应用程序的故障报告指令,说明目标应用程序出现了故障,此时可以获取目标应用程序对应的历史录制信息,以便回放历史录制信息中的历史调用参数,准确高效地定位目标应用程序出现故障的原因。
[0115]
本实施例一个可选的实施方式中,若录制调用参数时针对的是目标应用程序的当前会话,且将当前会话对应的存储位置标识记录在全局变量中,则可以直接从全局变量中获取位置存储标识,以获取到目标应用程序中当前会话对应的历史录制信息,也即获取目标应用程序对应的历史录制信息,具体实现可以如下:
[0116]
从全局变量中获取存储位置标识,根据存储位置标识获取目标应用程序当前对话对应的历史录制信息。
[0117]
需要说明的是,可以从全局变量中获取目标应用程序当前对话对应的存储位置标识,然后基于该存储位置标识直接在对应的目标存储位置处提取到目标应用程序当前会话对应的历史录制信息,该历史录制信息中可以包括针对目标应用程序中当前会话运行过程录制的各个调用参数,该调用参数可以是第一函数的返回值,也可以是第二函数的函数参数,从而便于后续直接回放该历史录制信息中包括的各个历史调用参数,复现目标应用程序当前会话的运行情况,定位故障的原因。
[0118]
另外,获得目标应用程序对应的历史录制信息,可以将历史录制信息作为故障报告指令对应的故障报告附件。然后,可以通过邮件发送给工作人员,也可以上传至服务端。工作人员通过下载邮件中的附件,或者从服务端获取该历史录制信息。
[0119]
示例的,以存储位置标识为数据库为例,可以根据数据库名称,从indexeddb中取出录制的调用参数bridgecall,序列化成二进制数据做为故障报告的附件邮件发送给工作人员。
[0120]
步骤106:根据历史录制信息中的历史调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,其中,回放的执行数据用于确定目标应用程序的故障原因。
[0121]
其中,该执行数据可以指示代码运行过程目标应用程序的内部状态变化。
[0122]
需要说明的是,当工作人员获取到用户提交的故障报告,提取出其中的历史录制信息后,工作人员可以通过应用程序平台执行目标应用程序的代码,回放使用和录制时完全相同的webassembly文件,需要替换的是javascript部分,使用历史录制信息的调用参数替换代码执行所需的用户输入信息,模拟用户实际的线上运行情况,回放同样在目标应用程序对应的窗口中,用目标应用程序执行javascript代码和webassembly代码完成。如此,
工作人员处理用户反馈的故障时,回放历史录制信息,一步步执行观察实际的运行画面输出,以及应用内部的状态,从而提高排查故障原因的准确率和效率。
[0123]
本实施例一个可选的实施方式中,根据历史录制文件中的历史调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,具体实现过程可以如下:
[0124]
确定目标调用参数的参数类型,并确定参数类型对应的目标执行规则,其中,目标调用参数初始为历史录制信息中首个历史调用参数;
[0125]
根据目标执行规则和目标调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据。
[0126]
需要说明的是,历史录制信息中的历史调用参数可以包括两类,一类是针对第一函数的返回值,一类是针对第二函数的函数参数,不同类型的调用参数执行规则并不相同,也即不同参数类型对应的目标执行规则可以不同。历史录制信息可以是序列化后的二进制文件,还可以反序列化获得数组,该数组中每个数值为一个调用参数,数组下标表示各个调用参数的排序顺序,也即时序。
[0127]
作为一种示例,返回值类型对应的目标执行规则可以为基于当前的目标调用参数运行代码,然后继续遍历历史录制信息中当前的目标调用参数的下一个调用参数,也即数组下标i加1;函数参数类型对应的目标执行规则可以为基于当前的目标调用参数和其后设定数值个调用参数运行代码,然后继续遍历历史录制信息中当前的调用参数后第设定数值个调用参数,也即是当前的目标调用参数后的设定数值个调用参数不遍历,直接继续遍历i加n+1对应的调用参数,n为当前的目标调用参数的数组下标。
[0128]
其中,设定数值与调用第二函数的过程中调用第一函数的次数对应,如调用第二函数的过程中调用了一次第一函数,此时第i+1个调用参数直接用于实现第一函数的调用,无需遍历,此时继续遍历第i+2个调用参数即可。
[0129]
本说明书实施例中,结合历史录制信息中各调用参数的参数类型,确定各调用参数的执行规则,该执行规则反映历史录制信息中不同类型的调用参数的遍历规则,该执行规则基于实际运行逻辑配置,从而保证回放过程按照实际运行逻辑遍历调用参数,准确回放目标应用程序的实际线上运行画面和内部状态,以保证准确高效地定位故障原因。
[0130]
本实施例一个可选的实施方式中,根据目标执行规则和目标调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,具体实现过程可以如下:
[0131]
在参数类型为返回值类型的情况下,根据返回值复现调用第一函数的过程,回放第一函数的函数参数,并将历史录制信息中目标调用参数的下一个调用参数作为更新后的目标调用参数,返回执行确定目标调用参数的参数类型的操作步骤;
[0132]
在参数类型为函数参数类型的情况下,根据函数参数复现调用第二函数的过程,回放第二函数的返回值,并基于调用第二函数的过程更新目标调用参数,返回执行确定目标调用参数的参数类型的操作步骤。
[0133]
需要说明的是,回放返回值类型的调用参数时,是基于该调用参数执行第一函数,该第一函数的执行过程中不涉及第二函数的调用,因而回放执行完成后,可以直接继续遍历历史录制信息中的下一个调用参数,保证了回放过程按照实际运行逻辑遍历调用参数,准确回放目标应用程序的实际线上运行画面和内部状态,以保证准确高效地定位故障原因。
[0134]
本实施例一个可选的实施方式中,基于调用第二函数的过程更新目标调用参数,具体实现过程可以如下:
[0135]
在调用第二函数的过程中若存在调用第一函数的情况,则从历史录制信息中获取目标调用参数后的设定数值个调用参数,根据设定数值个调用参数调用第一函数,并根据设定数值对目标调用参数进行更新。
[0136]
需要说明的是,回放函数参数类型的调用参数时,是基于该调用参数执行第二函数,该第二函数的执行过程中会调用第一函数,因而回放第二函数的过程,需要从历史录制信息中确定执行第一函数所需的返回值(即函数参数的下一个调用参数)以执行第一函数,回放完成后,直接继续遍历历史录制信息中该返回值的下一个调用参数,也即当前遍历的函数参数的下下一个调用参数,保证了回放过程按照实际运行逻辑遍历调用参数,准确回放目标应用程序的实际线上运行画面和内部状态,以保证准确高效地定位故障原因。
[0137]
实际应用中,给定从历史录制信息中提取的调用参数bridgecall列表为bridgecall[]数组,每个bridgecall的数组下标code要么是jscallcode或者是wasmcallcode,其对应了一个调用参数bridgecall在bridgecall[]数组中的下标位置。在回放时,按顺序遍历bridgecall[]数组中录制的wasmcall调用的函数参数,执行replaywasmcall。replaywasmcall回放wasmcall通过调用webassembly中的wasm_call函数完成。在回放wasmcall时,webassembly的内部实现会调用javascript侧的window.jscall。在回放之前把window.jscall替换成回放版本的实现replayjscall,即bridgecall[]数组中的调用参数。replayjscall和replaywasmcall共享相同的数组遍历下标replayindex,也即回放过的调用参数不再遍历,跳过相应的数组下标。
[0138]
作为一种示例,回放代码可以如下:
[0139][0140][0141]
示例的,图2c是本说明一是实施例提供的一种历史录制信息中调用参数的遍历过程示意图,如图2c所示,历史录制信息为bridgecall[]数组,当前数组下标i等于2,当前的目标调用参数为历史录制信息中bridgecall[]数组第2个调用参数,该第2个调用参数的参数类型为函数参数类型,根据该第2个调用参数回放第二函数wasmcall,也即replay wasmcall,调用wasmcall在webassembly中对应的wasm_call函数,在调用wasm_call后,webassembly中还调用了一次第一函数js_call,确定历史录制信息bridgecall[]数组中第3个调用参数作为javascript的返回值,回放第一函数js_call,也即replayjs_call。然后,令i=4,当前的目标调用参数为历史录制信息中第4个调用参数,继续确定该第4个调用参数的参数类型,循环上述回复过程,直至最后一个调用参数。
[0142]
需要说明的是,工作人员回放历史录制信息的时候,除了对数据传输通道上录制获得的调用参数做了替换,其余部分都是和生产环境相同的代码,使得回放的过程能够真实运行到被调试的代码,可以重建故障发生之前目标应用程序的内部状态,使得工作人员可以观察回放时目标应用程序的内部状态,获得更直接的故障诊断信息。另外,可以通过回放来重现webassembly在运行画面(canvas)上的输出,从而无需录制运行画面,节省录制资源。
[0143]
本说明书实施例提供的应用程序的故障排查方法,在目标应用程序的运行过程中,可以对目标应用程序中第一类型代码和第二类型代码之间函数调用的数据传输通道上的调用参数进行录制,该调用参数可以反映用户在目标应用程序中所执行的操作,因而在
目标应用程序出现故障时,可以直接基于之前运行过程中录制的历史调用参数,重新执行目标应用程序的代码,回放目标应用程序的执行数据,回放执行数据的过程会重现目标应用程序的运行画面,从而无需录制目标应用程序的运行画面,结合目标应用程序的执行数据和重现的运行画面,工作人员可以确定出目标应用程序的故障原因,提高目标应用程序的故障原因排查准确率和效率。
[0144]
下述结合附图3,以本说明书提供的应用程序的故障排查方法在浏览器场景的应用为例,对应用程序的故障排查方法进行进一步说明。其中,图3示出了本说明书一实施例提供的一种应用于浏览器场景的应用程序的故障排查方法的处理流程图,具体包括以下步骤:
[0145]
步骤302:针对运行在浏览器中、使用webassembly的网页应用,通过应用管理平台规范webassembly和javascript的通信信道。
[0146]
需要说明的是,步骤302具体可以包括如下步骤:
[0147]
通过把webassembly调用javascript的调用处都修改为调用js_call,可以在js_call上录制到javascript中函数的返回值。
[0148]
通过把javascript调用webassembly的调用处都修改为调用wasmcall,可以在wasmcall上录制到调用webassembly中函数所需的函数参数。
[0149]
步骤304:在用户使用该网页应用的过程中,对webassembly和javascript通信信道上的input/output全量录制。
[0150]
需要说明的是,对webassembly和javascript通信信道上的input/output全量录制,包括js_call录制方案和wasmcall录制方案。
[0151]
其中,js_call录制方案为:c代码在调用js_call之前,用protobuf序列化协议把c结构体序列化为二进制的字节数组;把序列化结果做为js_call的参数,调用js_call;c的js_call调用javascript的jscall;在jscall中,调用对应jscallcode的js函数实现;对应jscallcode的js函数实现把返回值中的javascript对象用protobuf序列化成二进制的字节数组,返回值给jscall;在jscall中,额外拷贝一份jscallcode和序列化了的返回值,称之为bridgecall;把bridgecall拷贝至一个限制长度的队列bridgecalls中,如果队列超过长度限制则丢弃;异步的savebridgecall javascript协程消费该bridgecalls队列,把bridgecalls队列保存到浏览器提供的indexeddb之中。
[0152]
wasmcall录制方案为:javascript代码在调用wasmcall之前,用protobuf序列化协议把javascript对象序列化为二进制的字节数组;把序列化结果做为wasmcall的参数,调用wasmcall;在wasmcall中,额外拷贝一份wasmcallcode和序列化了的参数,称之为bridgecall。把bridgecall拷贝至一个限制长度的队列bridgecalls中,如果队列超过长度限制则丢弃;异步的savebridgecall javascript协程消费该bridgecalls队列,把bridgecalls队列保存到浏览器提供的indexeddb之中。
[0153]
步骤306:用户反馈该网页应用的故障时,对历史录制信息的提取和上报。
[0154]
需要说明的是,对历史录制信息的提取和上报,可以包括如下步骤:浏览器tab被打开时,执行javascript代码;javascript代码在全局变量中记录当前这个浏览器tab对应的indexeddb的数据库名称;用户需要反馈故障,例如webassembly代码抛出异常的时候,从全局变量中获得indexeddb的数据库名称;根据数据库名称,从indexeddb中取出录制的
bridgecall,序列化成二进制数据做为故障报告的附件发送。
[0155]
步骤308:工作人员在应用管理平台处理用户反馈的故障时,回放附件中的历史录制信息,一步步执行去观察实际的cavans输出,以及网页应用内部的状态,定位故障原因。
[0156]
需要说明的是,当工作人员收到了用户提交的故障报告,提取出其中的历史录制信息附件。回放使用和录制时完全相同的webassembly文件。需要替换的仅仅是javascript部分。回放同样在浏览器窗口中,用浏览器执行javascript+webassembly完成。
[0157]
给定从录制文件中提取的bridgecall列表为bridgecall[]数组,每个bridgecall的code要么是jscallcode或者是wasmcallcode,其对应了一个在bridgecall[]数组中的下标位置。
[0158]
在回放时,按顺序遍历bridgecall[]数组中录制的wasmcall调用,执行replaywasmcall。replaywasmcall回放wasmcall通过调用webassembly中的wasm_call函数完成。在回放wasmcall时,webassembly的内部实现会调用javascript侧的window.jscall。在回放之前把window.jscall替换成回放版本的实现replayjscall。replayjscall和replaywasmcall共享相同的数组遍历下标replayindex。
[0159]
本说明书实施例提供的应用程序的故障排查方法,在运行在浏览器中、使用webassembly的网页应用的运行过程中,可以对网页应用中webassembly和javascript之间函数调用的通信信道上的input/output进行录制,该input/output可以反映用户在网页应用中所执行的操作,因而在网页应用出现故障时,可以直接基于之前运行过程中录制的input/output,重新执行网页应用的代码,回放执行数据的过程会重现网页应用的cavans输出,以及网页应用内部的状态,从而无需录制网页应用的cavans输出,结合网页应用的执行数据和重现的cavans输出,工作人员可以确定出网页应用的故障原因,提高网页应用的故障原因排查准确率和效率。
[0160]
与上述方法实施例相对应,本说明书还提供了应用程序的故障排查装置实施例,图4示出了本说明书一实施例提供的一种应用程序的故障排查装置的结构示意图。如图4所示,该装置包括:
[0161]
录制模块402,被配置为在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,目标应用程序的代码包括第一类型代码和第二类型代码,数据传输通道用于实现目标应用程序中第一类型代码和第二类型代码之间的函数调用;
[0162]
获取模块404,被配置为若检测到目标应用程序的故障报告指令,则获取目标应用程序对应的历史录制信息;
[0163]
回放模块406,被配置为根据历史录制信息中的历史调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,其中,回放的执行数据用于确定目标应用程序的故障原因。
[0164]
可选地,该装置还包括修改模块,被配置为:
[0165]
将目标应用程序的代码中第一类型代码调用第二类型代码的调用位置处修改为调用第一函数;
[0166]
将目标应用程序的代码中第二类型代码调用第一类型代码的调用位置处修改为调用第二函数;
[0167]
其中,第一函数和第二函数为预先封装的、用于录制函数调用过程的调用参数的
函数。
[0168]
可选地,录制模块402,进一步被配置为:
[0169]
通过第一函数录制第一类型代码调用第二类型代码的第一调用参数,并通过第二函数录制第二类型代码调用第一类型代码的第二调用参数。
[0170]
可选地,录制模块402,进一步被配置为:
[0171]
获取第一输入信息,并对第一输入信息进行序列化,获得对应的第一函数参数;
[0172]
根据第一函数参数执行第一函数的输入参数,获得并录制第一函数的返回值。
[0173]
可选地,录制模块402,进一步被配置为:
[0174]
获取第二输入信息,并对第二输入信息进行序列化,获得对应的第二函数参数;
[0175]
将第二函数参数作为第二函数的输入参数,调用第二函数,并录制函数参数。
[0176]
可选地,录制模块402,进一步被配置为:
[0177]
在第二类型代码的全局变量中记录目标应用程序当前会话对应的存储位置标识,并根据存储位置标识对录制的调用参数进行存储;
[0178]
相应地,获取模块404,进一步被配置为:
[0179]
从全局变量中获取存储位置标识,根据存储位置标识获取目标应用程序当前会话对应的历史录制信息。
[0180]
可选地,录制模块402,进一步被配置为:
[0181]
确定目标队列是否超过长度限制,其中,目标队列为存储目标应用程序的调用参数的队列;
[0182]
在目标队列未超过长度限制的情况下,将调用参数存储至目标队列中;
[0183]
异步消费目标队列,将目标队列存储至存储位置标识对应的目标存储位置。
[0184]
可选地,回放模块406,进一步被配置为:
[0185]
确定目标调用参数的参数类型,并确定参数类型对应的目标执行规则,其中,目标调用参数初始为历史录制信息中首个历史调用参数;
[0186]
根据目标执行规则和目标调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据。
[0187]
可选地,回放模块406,进一步被配置为:
[0188]
在参数类型为返回值类型的情况下,根据返回值复现调用第一函数的过程,回放第一函数的函数参数,并将历史录制信息中目标调用参数的下一个调用参数作为更新后的目标调用参数,返回执行确定目标调用参数的参数类型的操作步骤;
[0189]
在参数类型为函数参数类型的情况下,根据函数参数复现调用第二函数的过程,回放第二函数的返回值,并基于调用第二函数的过程更新目标调用参数,返回执行确定目标调用参数的参数类型的操作步骤。
[0190]
可选地,回放模块406,进一步被配置为:
[0191]
在调用第二函数的过程中若存在调用第一函数的情况,则从历史录制信息中获取目标调用参数后的设定数值个调用参数,根据设定数值个调用参数调用第一函数,并根据设定数值对目标调用参数进行更新。
[0192]
本说明书实施例提供的应用程序的故障排查装置,在目标应用程序的运行过程中,可以对目标应用程序中第一类型代码和第二类型代码之间函数调用的数据传输通道上
的调用参数进行录制,该调用参数可以反映用户在目标应用程序中所执行的操作,因而在目标应用程序出现故障时,可以直接基于之前运行过程中录制的历史调用参数,重新执行目标应用程序的代码,回放目标应用程序的执行数据,回放执行数据的过程会重现目标应用程序的运行画面,从而无需录制目标应用程序的运行画面,结合目标应用程序的执行数据和重现的运行画面,工作人员可以确定出目标应用程序的故障原因,提高目标应用程序的故障原因排查准确率和效率。
[0193]
上述为本实施例的一种应用程序的故障排查装置的示意性方案。需要说明的是,该应用程序的故障排查装置的技术方案与上述的应用程序的故障排查方法的技术方案属于同一构思,应用程序的故障排查装置的技术方案未详细描述的细节内容,均可以参见上述应用程序的故障排查方法的技术方案的描述。
[0194]
图5示出了根据本说明书一实施例提供的一种计算设备的结构框图。该计算设备500的部件包括但不限于存储器510和处理器520。处理器520与存储器510通过总线530相连接,数据库550用于保存数据。
[0195]
计算设备500还包括接入设备540,接入设备540使得计算设备500能够经由一个或多个网络560通信。这些网络的示例包括公用交换电话网(pstn,public switched telephone network)、局域网(lan,localarea network)、广域网(wan,wideareanetwork)、个域网(pan,personalarea network)或诸如因特网的通信网络的组合。接入设备540可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(nic,network interface controller))中的一个或多个,诸如ieee802.11无线局域网(wlan,wireless localareanetworks)无线接口、全球微波互联接入(wi-max,worldwide interoperability for microwave access)接口、以太网接口、通用串行总线(usb,universal serial bus)接口、蜂窝网络接口、蓝牙接口、近场通信(nfc,nearfield communication)接口,等等。
[0196]
在本说明书的一个实施例中,计算设备500的上述部件以及图5中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图5所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
[0197]
计算设备500可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或pc的静止计算设备。计算设备500还可以是移动式或静止式的服务器。
[0198]
其中,处理器520用于执行如下计算机可执行指令,以实现上述的应用程序的故障排查方法的步骤。
[0199]
上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的应用程序的故障排查方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述应用程序的故障排查方法的技术方案的描述。
[0200]
本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时以用于实现上述的应用程序的故障排查方法的步骤。
[0201]
上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存
储介质的技术方案与上述的应用程序的故障排查方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述应用程序的故障排查方法的技术方案的描述。
[0202]
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0203]
计算机指令包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质等。
[0204]
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书并不受所描述的动作顺序的限制,因为依据本说明书,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书所必须的。
[0205]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
[0206]
以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。
技术特征:
1.一种应用程序的故障排查方法,其特征在于,所述方法包括:在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,所述目标应用程序的代码包括第一类型代码和第二类型代码,所述数据传输通道用于实现所述目标应用程序中第一类型代码和第二类型代码之间的函数调用;若检测到所述目标应用程序的故障报告指令,则获取所述目标应用程序对应的历史录制信息;根据所述历史录制信息中的历史调用参数,执行所述目标应用程序的代码,回放所述目标应用程序的执行数据,其中,回放的执行数据用于确定所述目标应用程序的故障原因。2.根据权利要求1所述的方法,其特征在于,所述目标应用程序中第一类型代码和第二类型代码之间的数据传输通道通过如下方式配置:将所述目标应用程序的代码中所述第一类型代码调用所述第二类型代码的调用位置处修改为调用第一函数;将所述目标应用程序的代码中所述第二类型代码调用所述第一类型代码的调用位置处修改为调用第二函数;其中,所述第一函数和所述第二函数为预先封装的、用于录制函数调用过程的调用参数的函数。3.根据权利要求2所述的方法,其特征在于,所述对数据传输通道上的调用参数进行录制,包括:通过所述第一函数录制所述第一类型代码调用所述第二类型代码的第一调用参数,并通过所述第二函数录制所述第二类型代码调用所述第一类型代码的第二调用参数。4.根据权利要求3所述的方法,其特征在于,所述通过所述第一函数录制所述第一类型代码调用所述第二类型代码的第一调用参数,包括:获取第一输入信息,并对所述第一输入信息进行序列化,获得对应的第一函数参数;根据所述第一函数参数执行所述第一函数的输入参数,获得并录制所述第一函数的返回值。5.根据权利要求3所述的方法,其特征在于,所述通过所述第二函数录制所述第二类型代码调用所述第一类型代码的第二调用参数,包括:获取第二输入信息,并对所述第二输入信息进行序列化,获得对应的第二函数参数;将所述第二函数参数作为所述第二函数的输入参数,调用所述第二函数,并录制所述函数参数。6.根据权利要求1-5任一项所述的方法,其特征在于,所述对数据传输通道上的调用参数进行录制之后,还包括:在所述第二类型代码的全局变量中记录所述目标应用程序当前会话对应的存储位置标识,并根据所述存储位置标识对录制的调用参数进行存储;相应地,所述获取所述目标应用程序对应的历史录制信息,包括:从所述全局变量中获取所述存储位置标识,根据所述存储位置标识获取所述目标应用程序当前会话对应的历史录制信息。7.根据权利要求6所述的方法,其特征在于,所述根据所述存储位置标识对录制的调用参数进行存储,包括:
确定目标队列是否超过长度限制,其中,所述目标队列为存储所述目标应用程序的调用参数的队列;在所述目标队列未超过长度限制的情况下,将所述调用参数存储至所述目标队列中;异步消费所述目标队列,将所述目标队列存储至所述存储位置标识对应的目标存储位置。8.根据权利要求2所述的方法,其特征在于,所述根据所述历史录制文件中的历史调用参数,执行所述目标应用程序的代码,回放所述目标应用程序的执行数据,包括:确定目标调用参数的参数类型,并确定所述参数类型对应的目标执行规则,其中,所述目标调用参数初始为所述历史录制信息中首个历史调用参数;根据所述目标执行规则和所述目标调用参数,执行所述目标应用程序的代码,回放所述目标应用程序的执行数据。9.根据权利要求8所述的方法,其特征在于,所述根据所述目标执行规则和所述目标调用参数,执行所述目标应用程序的代码,回放所述目标应用程序的执行数据,包括:在所述参数类型为返回值类型的情况下,根据所述返回值复现调用所述第一函数的过程,回放所述第一函数的函数参数,并将所述历史录制信息中目标调用参数的下一个调用参数作为更新后的目标调用参数,返回执行所述确定目标调用参数的参数类型的操作步骤;在所述参数类型为函数参数类型的情况下,根据所述函数参数复现调用所述第二函数的过程,回放所述第二函数的返回值,并基于调用所述第二函数的过程更新所述目标调用参数,返回执行所述确定目标调用参数的参数类型的操作步骤。10.根据权利要求9所述的方法,其特征在于,所述基于调用所述第二函数的过程更新所述目标调用参数,包括:在调用所述第二函数的过程中若存在调用所述第一函数的情况,则从所述历史录制信息中获取所述目标调用参数后的设定数值个调用参数,根据所述设定数值个调用参数调用所述第一函数,并根据所述设定数值对所述目标调用参数进行更新。11.一种应用程序的故障排查装置,其特征在于,所述装置包括:录制模块,被配置为在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,所述目标应用程序的代码包括第一类型代码和第二类型代码,所述数据传输通道用于实现所述目标应用程序中第一类型代码和第二类型代码之间的函数调用;获取模块,被配置为若检测到所述目标应用程序的故障报告指令,则获取所述目标应用程序对应的历史录制信息;回放模块,被配置为根据所述历史录制信息中的历史调用参数,执行所述目标应用程序的代码,回放所述目标应用程序的执行数据,其中,回放的执行数据用于确定所述目标应用程序的故障原因。12.一种计算设备,包括:存储器和处理器;所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令,以实现上述权利要求1-10任一项所述的应用程序的故障排查方法的步骤。13.一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现上述
权利要求1-10任一项所述的应用程序的故障排查方法的步骤。
技术总结
本说明书提供应用程序的故障排查方法及装置,其中应用程序的故障排查方法包括:在目标应用程序启动的情况下,对数据传输通道上的调用参数进行录制,其中,目标应用程序的代码包括第一类型代码和第二类型代码,数据传输通道用于实现目标应用程序中第一类型代码和第二类型代码之间的函数调用;若检测到目标应用程序的故障报告指令,则获取目标应用程序对应的历史录制信息;根据历史录制信息中的历史调用参数,执行目标应用程序的代码,回放目标应用程序的执行数据,其中,回放的执行数据用于确定目标应用程序的故障原因。直接基于之前运行过程中录制的历史调用参数,重新执行代码,回放目标应用程序的运行情况,准确高效定位故障原因。障原因。障原因。
技术研发人员:陶文
受保护的技术使用者:北京看云软件有限公司
技术研发日:2023.04.20
技术公布日:2023/7/12
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:一种松香开桶破碎机的制作方法 下一篇:水洗机自动化定量加料装置的制作方法