调用堆栈关系获取方法及装置的制造方法
【技术领域】
[0001] 本发明涉及网络技术领域,特别涉及一种调用堆栈关系获取方法及装置。
【背景技术】
[0002] JavaScript函数的调用堆栈关系指JavaScript函数之间的调用关系。例如,A文 件a函数调用了B文件b函数,B文件b函数调用了C文件c函数,则调用堆栈关系可以表 示为:A:a->B:b_>C:c。开发人员根据该JavaScript函数的调用堆栈关系,能够在缺乏相应 的函数名和程序注释的情况下,阅读JavaScript代码。
[0003] -般地,在JavaScript代码发布前,采用JavaScript代码混淆技术对待发布 JavaScript代码进行混淆,将待发布代码中的所有变量、函数、类的名称变为简短的英文字 母代号,去除待发布代码中的冗余信息,使得混淆后代码与混淆前代码完成相同的功能,混 淆后代码很难被反编译,实现了对JavaScript代码的保护。
[0004] 由于混淆后代码缺乏相应的函数名和程序注释,使得开发人员无法阅读混淆后代 码,不能获取混淆后代码的函数之间的调用关系,无法对混淆后代码进行测试。
【发明内容】
[0005] 为了解决现有技术的问题,本发明实施例提供了一种调用堆栈关系获取方法及装 置。所述技术方案如下:
[0006] -方面,提供了一种调用堆栈关系获取方法,所述方法包括:
[0007] 对于打开的每一个页面,记录所述页面所加载的多个代码文件;
[0008] 对于所述页面中运行的多个代码文件中的每一个函数,在所述函数开始运行和结 束运行时,至少获取所述函数的调用层次,所述函数的调用层次包括调用所述函数的函数 名和所述函数调用的函数名中的至少一项;
[0009] 根据所述多个代码文件中每个函数的调用层次,得到所述多个代码文件的调用堆 栈关系。
[0010] 另一方面,提供了一种调用堆栈关系获取装置,所述装置包括:
[0011] 代码文件加载模块,用于对于打开的每一个页面,记录所述页面所加载的多个代 码文件;
[0012] 调用信息获取模块,用于对于所述页面中运行的多个代码文件中的每一个函数, 在所述函数开始运行和结束运行时,至少获取所述函数的调用层次,所述函数的调用层次 包括调用所述函数的函数名和所述函数调用的函数名中的至少一项;
[0013] 调用堆栈关系获取模块,用于根据所述多个代码文件中每个函数的调用层次,得 到所述多个代码文件的调用堆栈关系。
[0014] 本发明实施例提供的技术方案带来的有益效果是:
[0015] 在代码运行过程中,对于打开的每一个页面,通过记录该页面所加载的多个代码 文件,并记录函数开始运行和结束运行时的调用层次,从而得到该页面中多个代码文件的 调用堆栈关系,该调用堆栈关系可以直观显示该页面中多个代码文件的函数之间的逻辑调 用关系,使得开发人员在缺乏相应的函数名和程序注释的情况下,也可以对代码进行测试。
【附图说明】
[0016] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使 用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于 本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他 的附图。
[0017] 图1是本发明实施例提供的调用堆栈关系获取方法流程图;
[0018] 图2是本发明实施例提供的调用堆栈关系获取方法流程图;
[0019] 图3是本发明实施例提供的二元组获取示意图;
[0020] 图4是本发明实施例提供的调用堆栈关系获取示意图;
[0021] 图5是本发明实施例提供的调用堆栈关系应用示意图;
[0022] 图6是本发明实施例提供的调用堆栈关系应用示意图;
[0023] 图7是本发明实施例提供的调用堆栈关系获取装置结构示意图。
【具体实施方式】
[0024] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方 式作进一步地详细描述。
[0025] 图1是本发明实施例提供的调用堆栈关系获取流程图。参见图1,该实施例包括:
[0026] 101、对于打开的每一个页面,记录该页面所加载的多个代码文件。
[0027] 102、对于该页面中运行的多个代码文件中的每一个函数,在该函数开始运行和结 束运行时,至少获取该函数的调用层次,该函数的调用层次包括调用该函数的函数名和该 函数调用的函数名中的至少一项。
[0028] 103、根据该多个代码文件中每个函数的调用层次,得到该多个代码文件的调用堆 栈关系。
[0029] 本发明实施例提供的方法,在代码运行过程中,对于打开的每一个页面,通过记录 该页面所加载的多个代码文件,并记录该页面中多个代码文件的每一个函数开始运行和结 束运行时,函数的调用层次,从而得到该页面中多个代码文件的调用堆栈关系,该调用堆栈 关系可以直观显示该页面中多个代码文件的函数之间的逻辑调用关系,使得开发人员在缺 乏相应的函数名和程序注释的情况下,也可以对代码进行测试。
[0030] 可选地,对于该页面中运行的多个代码文件中的每一个函数,在该函数开始运行 和结束运行时,至少获取该函数的调用层次包括:
[0031] 对于该页面中运行的多个代码文件中的每一个函数,当该函数开始运行时,至少 获取调用该函数的函数名;
[0032] 当该函数结束运行时,至少获取该函数调用的函数名。
[0033] 可选地,该方法还包括:
[0034] 对于该页面中运行的多个代码文件中的每一个函数,在该函数开始运行和结束运 行时,获取该函数的行号。
[0035] 可选地,该方法还包括:
[0036] 确定变化的行号对应的函数;
[0037] 根据该多个代码文件的调用堆栈关系,确定该函数在输出的调用堆栈关系中所对 应的部分;
[0038] 根据该函数在输出的调用堆栈关系中所对应的部分,确定当前行号变化所影响的 功能。
[0039] 可选地,根据该函数在输出的调用堆栈关系中所对应的部分,确定当前行号变化 所影响的功能包括:
[0040] 根据该函数在输出的调用堆栈关系中所对应的部分,确定该调用堆栈关系中所对 应部分对应的代码文件;
[0041] 根据该代码文件,确定加载该代码文件的页面对应的功能。
[0042] 可选地,该方法还包括:
[0043] 对该多个代码文件进行混淆后,得到发布代码;
[0044] 根据该多个代码文件的调用堆栈关系,确定该发布代码中函数之间的调用关系;
[0045] 根据该发布代码中函数之间的调用关系,对该发布代码进行调整。
[0046] 图2是本发
明实施例提供的调用堆栈关系获取方法流程图。本发明实施例以页面 加载多个javascript文件为例进行说明,参见图2,该实施例包括:
[0047] 201、对于打开的每一个页面,测试设备记录该页面所加载的多个代码文件。
[0048] 其中,一个页面可以加载多个代码文件,每个代码文件包括多个函数,每个代码文 件对应页面的部分功能。每个页面打开时,测试设备会加载多个代码文件,当接收到页面中 某个功能的执行指令时,测试设备可以运行与该功能对应的代码文件中的函数,实现该功 能。
[0049] 在本发明实施例中,对代码进行测试或更新等处理时,对于打开的每一个页面,记 录该页面所加载的多个代码文件。其中,该代码可以是用JavaScript语言编写的代码,也 可以是C语言编写的代码,本发明实施例不作具体限定。
[0050] 在本发明实施例中,测试设备记录该页面所加载的多个代码文件的方式可以是 为代码分配一个全局变量,该全局变量命名可以为window, jsarray,该全局变量window, jsarray用于记录当前页面加载的所有代码文件。
[0051] 以如下javascript代码为例,具体代码如下:
[0053] 其中,javascript代码中处于与"//"同一行且位于"//"之后的内容时 javascript代码中的注释,"/home/XXspace/XXMail/js_obfuscator/cu;rrent_name.js,'是 加载的代码文件的地址。
[0054] 202、对于该页面中运行的多个代码文件中的每一个函数,当该函数开始运行和结 束运行时,测试设备至少获取该函数的调用层次,该函数的调用层次包括调用该函数的函 数名和该函数调用的函数名中的至少一项。
[0055] 页面中运行的多个代码文件中的函数之间存在调用关系。以函数A和函数B为例, 函数之间的调用关系可以是A函数结束运行时调用B函数,也可以是A函数运行过程中调 用B函数。
[0056] 在本发明实施例中,对于该页面中运行的多个代码中的每一个函数,当该函数开 始运行时,至少获取调用该函数的函数名,当该函数结束运行,至少获取该函数调用的函数 名。
[0057] 例如,以A文件a函数、B文件b函数和C文件c函数为例,假设A文件a函数调用 B文件b函数,则a函数为调用的第一层,b函数为调用的第二层;B文件b函数调用C文件 c函数,则在这个调用中,c函数为调用的第三层。当测试设备运行至B文件b函数时,在B 文件b函数开始运行时,获取调用B文件b函数的A文件a函数的函数名;在B文件b函数 结束运行时,获取B文件b函数调用的C文件c函数的函数名。
[0058] 进一步可选地,对于该页面中运行的多个代码文件中的每一个函数,在该函数开 始运行和结束运行时,测试设备在获取该函数的调用层次的基础上,还可以获取该函数的 运行时间,也即是,在该函数开始运行时,获取该函数开始运行的时间,在该函数结束运行 时,获取该函数结束运行的时间,以便后续在代码测试数据量较大时,可以根据函数的运行 时间,区分不同时段的测试过程。
[0059] 进一步可选地,对于该页面中运行的多个代码文件中的每一个函数,在该函数开 始运行和结束运行时,测试设备在获取该函数的调用层次的基础上,还可以获取该函数的 行号,也即是,在该函数开始运行时,获取该函数开始运行的行号,在该函数结束运行时,获 取该函数结束运行的行号,以便后续根据该行号,可以方便定位函数在代码文件中的范围。
[0060] 在本发明实施例中,测试设备获取该函数的调用层次的方式可以是为代码分配另 一个全局变量,该全局变量命名为window, jslevel,该全局变量window, jslevel用于记录 函数的调用层次。
[0061] 以如下javascript代码为例,具体代码如下:
[0063]
[0064] 其中,"/林debug-on林/"指代码测试开始,/**debug_off林/指代码测试结束;函 数console, log()用于输出函数的调用层次和行号。
[0065] 203、将该多个代码文件中每个函数的调用层次作为二元组的元素,测试设备得到 该多个代码文件的调用二元组。
[0066] 在本发明实施例中,在每个函数开始运行和结束运行时,测试设备收集每个函数 的调用层次、运行时间以及行号等,根据调用层次,得到该多个代码文件的调用二元组,该 调用二元组以每个函数的调用层次作为元素,该二元组的格式可以为(文件A::函数A->文 件B::函数B)。例如,假设测试设备收集的函数调用层次为,文件A的函数A调用了文件 B的函数B;文件B的函数B调用了文件C的函数C,贝1J该调用二元组可以为(文件A::函数 A_>文件B::函数B),(文件B::函数B->文件C::函数C)。
[0067] 需要说明的是,本发明实施例是将函数的调用层次、运行时间以及行号等信息存 储在本端,由该测试设备根据存储的调用层次,得到该多个代码文件的调用二元组。事实 上,在本发明的另一实施例中,测试设备也可以将函数的调用层次、运行时间以及行号等信 息上报至服务器,由服务器根据上报的调用层次,得到该多个代码文件的调用二元组。也即 是,测试设备可以通过CGI (Common Gateway Interface,通用网关界面)在每个函数开始 运行和结束运行时,将函数的调用层次、运行时间以及行号等上报至服务器,使得服务器根 据上报的调用层次,得到该多个代码文件的调用二元组,该调用二元组以每个函数的调用 层次作为元素。
[0068] 如图3所示的测试设备根据上报日志得到二元组的示意图。在图3中,左边是原 始日志,测试设备将原始日志按照会话ID(Identity,身份标识)(sid)分组,并按照函数 在整个运行过程中的运行次序(seq)排序,得到中间调用层次结构,也即是el、e2、e3为函 数开始运行的次序,而13、12、11函数结束运行的次序,根据函数之间的调用关系得到二元 组。其中,会话ID用于唯一标识一个测试过程,每打开一次浏览器就建立一个会话。
[0069] URL (Uniform Resource Locator,统一资源定位符)是对可以从互联网上得到的 资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址;CGI在物理上是 一段程序,运行在服务器上,提供同客户端页面的接口。每个页面对应一个URL,在URL加载 的多个代码文件中每个函数运行过程中,测试设备通过CGI将函数的调用层次、运行时间 以及行号等上报至服务器,根据记录的每个页面所加载的多个代码文件,可以确定该多个 代码文件与CGI之间的映射关系。
[0070] 204、按照函数在整个测试过程中的运行次序,测试设备将该调用二元组进行排 序,得到该多个代码文件的调用序列。
[0071] 在本发明实施中,测试设备是按照时间先后顺序,运行多个代码
文件中的函数,则 按照函数在整个测试过程中的运行次序,测试设备将该调用二元组进行排序,即可得到该 多个代码文件的调用序列。例如,假设二元组为(文件A::函数A->文件B::函数B),(文件 B::函数B->文件C::函数C),(文件C::函数C->文件D::函数D),文件A::函数A在整 个测试过程中第1个运行,文件B::函数B在整个测试过程中第2个运行,文件C::函数C 在整个测试过程中第3个运行,则该多个代码文件的调用序列为文件A::函数A->文件B:: 函数B->文件C::函数C->文件D::函数D。
[0072]当运行某页面的多个代码文件中的每个函数时,测试设备收集每个函数开始运行 和结束运行的会话ID、数据来源的用户号码、函数在整个运行过程中的运行次序和运行时 间等信息,该测试设备根据收集的该页面的多个代码文件中所有函数运行过程中的会话 ID、数据来源的用户号码、函数在整个运行过程中的运行次序和运行时间等信息,得到该页 面的调用序列。因此,可以如图4所示的形式在调用堆栈中对应存储该页面的多个代码文 件中所有函数运行过程中的会话ID、数据来源的用户号码、函数在整个运行过程中的运行 次序和运行时间等信息、该页面的URL和该页面的调用序列。
[0073]需要说明的是,步骤203-步骤204是根据该多个代码文件中每一个函数的调用层 次,得到该多个代码文件的调用堆栈关系的过程。本发明实施例以调用序列的形式表示多 个代码文件的调用堆栈关系,在本发明的另一实施例中也可以图表的形式表示多个代码文 件的调用堆栈关系,本发明实施例不做具体限定。
[0074]本发明实施例提供的方法,在代码运行过程中,对于打开的每一个页面,通过记录 该页面所加载的多个代码文件,并记录该页面中多个代码文件的每一个函数开始运行和结 束运行时,函数的调用层次,从而得到该页面中多个代码文件的调用堆栈关系,该调用堆栈 关系可以直观显示该页面中多个代码文件的函数之间的逻辑调用关系,使得开发人员在缺 乏相应的函数名和程序注释的情况下,也可以对代码进行测试。
[0075]利用本发明实施例提供的调用堆栈关系获取方法,可以实现对代码的控制,代码 可以有以下三种类型:
[0076]a、开发代码(开发原始代码);
[0077]该开发代码是未混淆的,包含调试信息、注释信息、空格符以及换行符等。
[0078]b、测试代码(供开发、测试使用)
[0079] 该测试代码可以是混淆后的,不包含调试信息、注释信息。该测试代码也可以是未 混淆的,包含调试信息、注释信息、空格符以及换行符等。
[0080] c、发布代码(发布给用户)。
[0081] 该发布代码是混淆的,不包含调试信息的、注释信息,可以不包含空格符和换行 符,也可以包含空格符和换行符。
[0082] 另外,利用本发明实施例提供的调用堆栈关系获取方法,如图5所示,可以实现以 下两种操作:
[0083]for_teSt操作:对代码进行静态语法分析,在函数入口、出口插入代码,解析出函 数调用堆栈关系,对代码做混淆,使得测试可以在测试代码的基础上进行测试,收集调用序 列;
[0084]for_releaSe操作:删除代码里面的调试信息,确保代码一定是混淆的,删除代码 中的注释,空格符、换行符等,起到压缩的作用,确保发布出去代码的安全性。
[0085] 根据上述两个操作,从代码开发阶段、测试阶段到发布阶段,开发人员可以完全控 制代码,可以做的选择包括:
[0086] 1、对开发的代码直接做for_release操作;
[0087] 2、对开发的代码先做for_test操作,不做混淆,代码测试通过后,做for_release 操作;
[0088] 3、对开发的代码先做for_teSt操作,做混淆,在混淆的代码上做测试,然后做 for_release操作。
[0089] 为了进一步描述该发明实施例的效果,下面以具体实例进行说明,详述如下:
[0090] 在代码发布之前,当对代码进行更新时,更新后的代码和已发布版本的代码在行 号上会发生变化,因此,通过比较更新后的代码和已发布版本的代码,可以确定变化的行 号,该行号变化代码对应的函数也相应改变,则加载包含该函数的代码文件的页面的功能 也会改变,利用本发明实施例得到的多个代码文件的调用堆栈关系,可以准确定位当前行 号变化所影响的功能。
[0091] 如图6所示,测试设备的处理过程包括:确定变化的行号对应的函数;根据该多个 代码文件的调用堆栈关系,确定该函数在输出的调用堆栈关系中所对应的部分;根据该函 数在输出的调用堆栈关系中所对应的部分,确定当前行号变化所影响的功能。具体地,测试 设备对代码进行测试或更新等处理时,测试设备根据收集的函数运行开始和运行结束的行 号,确定变化的行号对应的函数,该变化的行号对应的函数可能会被多个代码文件调用,则 根据多个代码文件的调用堆栈关系,确定该变化的行号对应的函数在哪些调用堆栈关系中 出现,进而确定调用堆栈关系中所对应的代码文件,根据记录的每个页面加载的代码文件, 可以确定加载该代码文件的页面,进而定位到加载该代码文件的页面对应功能。
[0092] 图7是本发明实施例提供的调用堆栈关系获取装置结构示意图。参见图3,该装 置包括:代码文件加载模块701、调用信息获取模块702和调用堆栈关系获取模块703。其 中:
[0093] 代码文件加载模块701用于对于打开的每一个页面,记录该页面所加载的多个代 码文件;代码文件加载模块701与调用信息获取模块702连接,调用信息获取模块702用于 对于该页面中运行的多个代码文件中的每一个函数,在该函数开始运行和结束运行时,至 少获取该函数的调用层次,该函数的调用层次包括调用该函数的函数名和该函数调用的函 数名中的至少一项;调用信息获取模块702与调用堆栈关系获取模块703连接,调用堆栈关 系获取模块703用于根据该多个代码文件中每个函数的调用层次,得到该多个代码文件的 调用堆栈关系。
[0094]可选地,该调用信息获取模块702用于对于该页面中运行的多个代码文件中的每 一个函数,当该函数开始运行时,至少获取调用该函数的函数名;当该函数结束运行时,至 少获取该函数调用的函数名。
[0095]可选地,该装置还包括:函数行号获取模块,用于对于该页面中运行的多个代码文 件中的每一个函数,在该函数开始运行和结束运行时,获取该函数的行号。
[0096]可选地,该装置还包括:函数确定模块,用于确定变化的行号对应的函数;调用堆 栈关系对于部分确定模块,用于根据该多个代码文件的调用堆栈关系,确定该函数在输出 的调用堆栈关系中所对应的部分;影响功能确定模块,用于根据该函数在输出的调用堆栈 关系中所对应的部分,确定当前行号变化所影响的功能。可选地,该影响功能确定模块还用 于根据该函数在输出的调用堆栈关系中所对应的部分,确定该调用堆
栈关系中所对应部分 对应的代码文件;根据该代码文件,确定加载该代码文件的页面对应的功能。
[0097] 可选地,该装置还包括:发布代码获取模块,用于对该多个代码文件进行混淆后, 得到发布代码;函数调用关系确定模块,用于根据该多个代码文件的调用堆栈关系,确定该 发布代码中函数之间的调用关系;发布代码调整模块,用于根据该发布代码中函数之间的 调用关系,对该发布代码进行调整。
[0098] 本发明实施例提供的装置,在代码运行过程中,对于打开的每一个页面,通过记录 该页面所加载的多个代码文件,并记录该页面中多个代码文件的每一个函数开始运行和结 束运行时,函数的调用层次,从而得到该页面中多个代码文件的调用堆栈关系,该调用堆栈 关系可以直观显示该页面中多个代码文件的函数之间的逻辑调用关系,使得开发人员在缺 乏相应的函数名和程序注释的情况下,也可以对代码进行测试。
[0099]需要说明的是:上述实施例提供的调用堆栈关系获取装置在调用堆栈关系获取 时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分 配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述 的全部或者部分功能。另外,上述实施例提供的调用堆栈关系获取装置与调用堆栈关系获 取方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0100] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件 来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读 存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0101] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和 原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【主权项】
1. 一种调用堆栈关系获取方法,其特征在于,所述方法包括: 对于打开的每一个页面,记录所述页面所加载的多个代码文件; 对于所述页面中运行的多个代码文件中的每一个函数,在所述函数开始运行和结束运 行时,至少获取所述函数的调用层次,所述函数的调用层次包括调用所述函数的函数名和 所述函数调用的函数名中的至少一项; 根据所述多个代码文件中每个函数的调用层次,得到所述多个代码文件的调用堆栈关 系。2. 根据权利要求1所述的方法,其特征在于,对于所述页面中运行的多个代码文件中 的每一个函数,在所述函数开始运行和结束运行时,至少获取所述函数的调用层次包括: 对于所述页面中运行的多个代码文件中的每一个函数,当所述函数开始运行时,至少 获取调用所述函数的函数名; 当所述函数结束运行时,至少获取所述函数调用的函数名。3. 根据权利要求1所述的方法,其特征在于,所述方法还包括: 对于所述页面中运行的多个代码文件中的每一个函数,在所述函数开始运行和结束运 行时,获取所述函数的行号。4. 根据权利要求3所述的方法,其特征在于,所述方法还包括: 确定变化的行号对应的函数; 根据所述多个代码文件的调用堆栈关系,确定所述函数在输出的调用堆栈关系中所对 应的部分; 根据所述函数在输出的调用堆栈关系中所对应的部分,确定当前行号变化所影响的功 能。5. 根据权利要求4所述的方法,其特征在于,根据所述函数在输出的调用堆栈关系中 所对应的部分,确定当前行号变化所影响的功能包括: 根据所述函数在输出的调用堆栈关系中所对应的部分,确定所述调用堆栈关系中所对 应部分对应的代码文件; 根据所述代码文件,确定加载所述代码文件的页面对应的功能。6. 根据权利要求1所述的方法,其特征在于,所述方法还包括: 对所述多个代码文件进行混淆后,得到发布代码; 根据所述多个代码文件的调用堆栈关系,确定所述发布代码中函数之间的调用关系; 根据所述发布代码中函数之间的调用关系,对所述发布代码进行调整。7. -种调用堆栈关系获取装置,其特征在于,所述装置包括: 代码文件加载模块,用于对于打开的每一个页面,记录所述页面所加载的多个代码文 件; 调用信息获取模块,用于对于所述页面中运行的多个代码文件中的每一个函数,在所 述函数开始运行和结束运行时,至少获取所述函数的调用层次,所述函数的调用层次包括 调用所述函数的函数名和所述函数调用的函数名中的至少一项; 调用堆栈关系获取模块,用于根据所述多个代码文件中每个函数的调用层次,得到所 述多个代码文件的调用堆栈关系。8. 根据权利要求7所述的装置,其特征在于,所述调用信息获取模块用于对于所述页 面中运行的多个代码文件中的每一个函数,当所述函数开始运行时,至少获取调用所述函 数的函数名;当所述函数结束运行时,至少获取所述函数调用的函数名。9. 根据权利要求7所述的装置,其特征在于,所述装置还包括: 函数行号获取模块,用于对于所述页面中运行的多个代码文件中的每一个函数,在所 述函数开始运行和结束运行时,获取所述函数的行号。10. 根据权利要求9所述的装置,其特征在于,所述装置还包括: 函数确定模块,用于确定变化的行号对应的函数; 调用堆栈关系对于部分确定模块,用于根据所述多个代码文件的调用堆栈关系,确定 所述函数在输出的调用堆栈关系中所对应的部分; 影响功能确定模块,用于根据所述函数在输出的调用堆栈关系中所对应的部分,确定 当前行号变化所影响的功能。11. 根据权利要求10所述的装置,其特征在于,所述影响功能确定模块还用于根据所 述函数在输出的调用堆栈关系中所对应的部分,确定所述调用堆栈关系中所对应部分对应 的代码文件;根据所述代码文件,确定加载所述代码文件的页面对应的功能。12. 根据权利要求7所述的装置,其特征在于,所述装置还包括: 发布代码获取模块,用于对所述多个代码文件进行混淆后,得到发布代码; 函数调用关系确定模块,用于根据所述多个代码文件的调用堆栈关系,确定所述发布 代码中函数之间的调用关系; 发布代码调整模块,用于根据所述发布代码中函数之间的调用关系,对所述发布代码 进行调整。
【专利摘要】本发明公开了一种调用堆栈关系获取方法及装置,属于网络技术领域。该方法包括:对于打开的每一个页面,记录该页面所加载的多个代码文件;对于该页面中运行的多个代码文件中的每一个函数,在该函数开始运行和结束运行时,至少获取该函数的调用层次,该函数的调用层次包括调用该函数的函数名和该函数调用的函数名中的至少一项;根据该多个代码文件中每个函数的调用层次,得到该多个代码文件的调用堆栈关系。本发明得到的页面中多个代码文件的调用堆栈关系,可以直观显示该页面的函数之间的逻辑关系,使得开发人员在缺乏相应的函数名和程序注释的情况下,也可以对代码进行测试。
【IPC分类】G06F9/44
【公开号】CN104899016
【申请号】CN201410084414
【发明人】母天石
【申请人】腾讯科技(深圳)有限公司
【公开日】2015年9月9日
【申请日】2014年3月7日
【公告号】WO2015131804A1