一种多线程分析与运行可视化方法与流程

文档序号:11250766阅读:1316来源:国知局
一种多线程分析与运行可视化方法与流程

本发明涉及数据分析技术领域,尤其涉及一种多线程分析与运行可视化方法。



背景技术:

目前很多项目,源代码行数较多,且为多线程并行执行,在此基础上需要对源代码进行改动的话,就需要查找所需函数进行针对性的修改,但在源代码行数较多的情况下查找某一函数或分析其代码构架等,都不是件容易的事,主要是通过人为查阅与分析实现的,为了帮助工程师对源代码进行分析,引入一些工具(如gnu编译器工具链)在运行源代码时获取运行时堆栈记录,从运行日志中分析并查找出所需函数,这在一定程度上降低了程序分析的难度。

现有的用于运行时堆栈记录分析的工具,主要是涉及对单线程程序分析,无法实现对多线程程序的分析,且只适用于较少量代码行的分析。现有的对单线程程序的分析方法,目前常见的是利用开源软件graphviz实现函数调用可视化,提供给工程师一个直观的函数调用关系图,具体为:先通过一编译器工具链(如gnu编译器工具链,可通过一参数finstrument-function对源代码所有函数调用形成一个代理入口)获取源程序运行日志,运行日志包括源程序各函数跟踪数据(函数地址和运行时堆栈),再利用一定制的中间代码(如pvtrace工具)对函数跟踪数据进行处理,并生成矩阵格式,再通过一地址映射工具(如addr2line工具)将获取到的函数地址映射成函数名以便用户阅读,最后利用开源的graphviz工具对整个源程序的函数调用关系进行图形绘制。但实际运用中,这种方法对日志分析的贡献有限,当涉及多线程程序或超过二十万行以上的大型项目时,其数据量太大且较为复杂,无法提取有效数据进行突出,工程师分析起来十分费劲。有鉴于此,开发一种多线程分析与运行可视化方法就显得尤为重要。



技术实现要素:

本发明要解决的技术问题,在于提供一种多线程分析与运行可视化方法,实现多线程运行数据的筛选分析与可视化展示,为工程师提供有效的源程序分析依据,提高软件开发效率。

本发明是这样实现的:一种多线程分析与运行可视化方法,包括如下步骤:

步骤1、运行源程序,采集所述源程序的线程id和运行时堆栈;

步骤2、根据所述线程id对采集到的运行时堆栈进行分离,使得每一线程id对应一个子运行时堆栈;

步骤3、统计每一所述子运行时堆栈中各函数的调用数据,所述调用数据包括归属模块、调用次数、调用深度和调用跨度;

步骤4、根据所述归属模块对每一所述子运行时堆栈中的基础类函数进行识别并过滤;

步骤5、根据预先设定的调用次数值、调用深度值和调用跨度值对每一所述子运行时堆栈做进一步过滤;

步骤6、对每一所述子运行时堆栈进行可视化展示,得到每一线程对应的函数调用关系图,供工程师分析查阅。

进一步的,所述线程id通过一外部程序直接调用操作系统线程api获得。

进一步的,所述运行时堆栈是通过在编译器添加标志,之后通过代理函数获得的。

进一步的,所述归属模块包括内存分配模块、文件操作模块和锁模块。

进一步的,所述步骤6具体为:通过提取每一子运行时堆栈中函数对应的文件名、方法名、目录、调用次数和函数调用顺序,利用开源graphviz软件绘制需要的函数调用分析图。

进一步的,所述函数调用分析图中通过颜色对重要函数节点进行标识,所述重要函数节点为跨度大于一阈值的函数节点。

本发明具有如下优点:通过对多线程运行时堆栈进行分离,再根据用户需要设置过滤参数(归属模块、调用次数值、调用深度值和调用跨度值)对一些不需要显示的函数进行筛选过滤,得到过滤后的各个子运行时堆栈,再对精简后的运行时堆栈进行可视化展现,从而提供给用户清晰简洁的分析图,便于用户查阅,本发明能实现对程序运行路径和热点的快速定位,有效提升大型软件项目的研发效率,缩短软件工程工期。

附图说明

下面参照附图结合实施例对本发明作进一步的说明。

图1为本发明一种多线程分析与运行可视化方法执行流程图。

图2为本发明一实施例的函数调用分析图。

具体实施方式

如图1所示,一种多线程分析与运行可视化方法,包括如下步骤:

步骤1、运行源程序,采集所述源程序的线程id和运行时堆栈,所述线程id通过一外部程序直接调用操作系统线程api获得,所述运行时堆栈是通过在编译器(如gnu编译器)添加标志,之后通过代理函数获得的;

步骤2、根据所述线程id对采集到的运行时堆栈进行分离,使得每一线程id对应一个子运行时堆栈;

步骤3、统计每一所述子运行时堆栈中各函数的调用数据,所述调用数据包括归属模块、调用次数、调用深度和调用跨度,所述归属模块包括内存分配模块、文件操作模块和锁模块;

步骤4、根据所述归属模块对每一所述子运行时堆栈中的基础类函数进行识别并过滤;

步骤5、根据预先设定的调用次数值、调用深度值和调用跨度值对每一所述子运行时堆栈做进一步过滤;

步骤6、对每一所述子运行时堆栈进行可视化展示,得到每一线程对应的函数调用关系图,供工程师分析查阅,所述步骤6具体为:通过提取每一子运行时堆栈中函数对应的文件名、方法名、目录、调用次数和函数调用顺序,利用开源graphviz软件绘制需要的函数调用分析图,所述函数调用分析图中通过颜色对重要函数节点进行标识,所述重要函数节点为跨度(即所包含的一级子函数个数)大于一阈值的函数节点。

下面结合一具体实施例对本发明做进一步说明:

采用本发明一种多线程分析与运行可视化方法,对一包括三个线程相互切换的源程序进行分析,具体步骤如下:

步骤1、运行源程序,通过在编译器(如gnu编译器)添加标志,之后通过代理获得运行时堆栈,并通过外部程序直接调用操作系统线程api获得源程序的线程id,例如本实施例中,源程序共有4个线程,即获得4个线程id,分别为1个主线程id(000)和3个子线程id(001、002和003);

步骤2、根据所述线程id对采集到的运行时堆栈进行分离,使得每一线程id对应一个子运行时堆栈,即该源程序的运行时堆栈可分离成4个子运行时堆栈;

步骤3、统计每一所述子运行时堆栈中各函数的调用数据,所述调用数据包括归属模块、调用次数、调用深度和调用跨度,所述归属模块主要包括内存分配模块、文件操作模块和锁模块等,频繁被调用的系统基础模块;

步骤4、根据所述归属模块对每一所述子运行时堆栈中的基础类函数进行识别并过滤,即识别并过滤掉内存分配模块、文件操作模块和锁模块等,频繁被调用的系统基础模块;

步骤5、根据预先设定的调用次数值、调用深度值和调用跨度值对每所述子运行时堆栈做进一步过滤;

步骤6、通过提取经上述两次过滤后的每一子运行时堆栈中函数对应的文件名、方法名、目录、调用次数和函数调用顺序,利用开源graphviz软件绘制需要的函数调用分析图,例如,将过滤用的调用次数值取100,调用深度值取4,调用跨度值取0,则得到如图2所示的四个线程的函数调用分析图。在该函数调用分析图中,函数节点用文件名、方法名和目录表示,两函数节点之间的调用关系用带箭头的线段表示,并通过在线段上标数字来直观识别调用顺序,以便用户快速查找定位,其中,所述函数调用分析图还对重要函数节点进行标识,所述重要函数节点为跨度(即所包含的一级子函数个数)大于一阈值的函数节点(一般取6)。

上述归属模块、调用次数、调用深度和调用跨度以及步骤6中所述的阈值均可以根据用户需要进行调整,从而选择性的隐藏一些不需要显示或冗余的函数,以便提供给用户清晰、重点突出的函数调用分析图,提高工程师后期函数的定位查询与分析效率。

本发明通过采集多线程运行时堆栈,按线程id对运行时堆栈进行分离,得到多个子运行时堆栈,再根据用户需要设置过滤参数(归属模块、调用次数值、调用深度值和调用跨度值)对一些不需要显示的函数进行筛选过滤,得到过滤后的各个子运行时堆栈,再分别过滤后的对各个线程进行可视化展现,提供给用户清晰简洁的分析图,以方便用户阅读,本发明可实现对程序运行路径和热点的快速定位,有效提升大型软件项目的研发效率,缩短软件工程工期。

虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1