一种程序监控方法及装置与流程

文档序号:14249310阅读:110来源:国知局
一种程序监控方法及装置与流程

本发明实施例涉及计算机技术领域,具体涉及一种程序监控方法及装置。



背景技术:

程序调试及监控是工业化软件生产必不可少的环节,为软件质量提供基础保证。

当前存在多种开源程序调试及监控技术。gdb是一种常用的程序调试工具,通过设置断点、步进等方式追踪程序内变量信息。通过在断点或指定位置暂停程序进程,使用者可以观察此时程序内部情况,以便定位设计缺陷。strace是一款linux系统调用追踪工具,提供系统调用的追踪功能,可以记录系统调用函数的调用历史,以及每次调用的参数及返回值信息。

然而现有的程序追踪监控及调试方法,如gdb或strace等在进行程序调试时,监控某一时间点上的程序状态,输出结果按照单一的时间维度排序,缺少对输出结果的多维度组织形式,进而使得追踪信息挖掘不充分,缺少对监控程序某一执行过程“生命周期”的全局把握,影响软件缺陷定位。



技术实现要素:

针对现有技术中的缺陷,本发明实施例提供了一种程序监控方法及装置。

第一方面,本发明实施例提供一种程序监控方法,包括:

确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;

当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;

调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;

确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;

根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

第二方面,本发明实施例提供一种程序监控装置,包括:

初始化模块,用于确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;

处理模块,用于当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;

调用模块,用于调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;

提取模块,用于确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;

监控模块,用于根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

第三方面,本发明实施例提供一种电子设备,包括:

存储器和处理器,所述处理器和所述存储器通过总线完成相互间的通信;所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如下方法:确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

第四方面,本发明实施例提供一种存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如下方法:确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

本发明实施例提供的程序追踪方法,通过在目标进程中,调用用户设置的追踪记录函数,使待监控程序中的任何变量都可以成为追踪目标,将待监控程序中的待追踪数据信息和触发时刻写入到共享内存中,在目标进程中通过共享内存获取属于同一轨道的所有待追踪数据和触发时刻,无需任何外部符号文件支持,不仅支持追踪内容的历史变动记录,还提供除时间之外的维度展示追踪结果,引入的轨道维度可为待监控程序中交叉模块或交叉线程结果的追踪提供支持,方便定位软件缺陷的根本原因。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例提供的程序监控方法流程示意图;

图2为本发明实施例提供的程序监控装置的结构示意图;

图3为本发明实施例提供的电子设备的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1为本发明实施例提供的程序监控方法流程示意图,如图1所示,该方法包括:

步骤s11、确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;

具体地,当用户需要监控一个linux用户态程序时,首先确定需要追踪的数据,然后用户预先自定义待追踪数据的结构体,可以将多个待追踪数据整合到同一结构体中,然后设置追踪记录函数,定义追踪记录函数所需入参以及与自定义结构各字段之间的对应关系,该部分通常为一一对应直接赋值的关系,可由软件自动化完成。之后,用户设置事件提取函数,用于显示自定义结构体中的数据。

然后在待监控程序中的第一位置上设置第一追踪点,该第一追踪点包括追踪点标识、追踪点名称和追踪点位置信息,以帮助用户定位。其中第一位置要确保第一追踪点能够获取到用户需要追踪的所有数据。之后,用户还需要确定该第一追踪点的轨道标识,这样,用户可以将多个第一追踪点通过轨道标识关联起来,可以扩展监控维度,替代单一的时间维度。当用户在第一位置上设置完第一追踪点之后,根据用户输入可以确定第一追踪点的位置信息,例如,第一追踪点所在待监控程序名称、所在待测程序行数以及所在函数名称等。然后获取用户设置的追踪记录函数和第一追踪点的轨道标识。

例如,待监控程序为网包处理程序,该程序所完成的功能如下:

网包处理程序首先在网络端口接收网包,网包包头可以按网络协议区分为多层协议,如二层以太网协议、三层ip协议,四层tcp协议等。可以利用三层和四层协议的5个协议字段(即五元组)将不同网包聚合为同一个连接。五元组包括ip协议源ip地址、目的ip地址、传输协议号,以及四层协议的源端口号和目的端口号。

网包处理程序在接收到网包之后,提取该网包的五元组,并将五元组作为哈希key进行哈希,取得哈希值,代表一个连接,再根据哈希值将网包包头信息储存在一张哈希表中,方便后续的连接查找。在哈希表插入操作完结之后,网包处理程序循环收取下一个网包,并执行同样的操作。

在网包处理程序中,为满足业务需求,需要追踪记录每一个进入五元组提取处理的网包的五元组信息。此时需要在网包处理程序的网包五元组提取函数中设置一个第一追踪点,用以追踪所有网包的五元组信息。

在网包五元组提取函数中设置第一追踪点时,用户首先定义所需的数据记录结构体。在一个结构体中,包含有源ip地址,目的ip地址,四层协议号,源端口和目的端口。数据类型在满足最低位宽需求的基础上可以自行指定。之后,用户设置第一追踪点轨道标识和自定义的追踪记录函数,主要用于自定义记录的入参,以及入参与自定义结构体的对应方式。在本实例中,入参即为五元组字段,与自定义的数据记录结构体为一一对应,直接赋值的关系。当然也可以在追踪记录函数中执行灵活的数据处理和对应关系,本发明实施例对此不作限定。

步骤s12、当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;

具体地,预先在目标进程用户空间申请一块虚拟内存空间,该虚拟内存空间与共享内存相对应,将该空间初始化为循环队列数据结构,每次写入数据占用循环队列的一个队列块。

当待测监控程序运行时,执行到第一追踪点时,第一追踪点被触发,此时第一追踪点获取触发时刻,例如从cpu硬件寄存器中直接读取当前时刻。这样时间精度可以达到纳秒级。同时第一追踪点获取预先申请的第一循环队列,其中,第一循环队列为第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间,该空间为循环队列数据结构。

步骤s13、调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;

具体地,确定第一循环队列之后,调用用户设置的追踪记录函数,获取待追踪数据信息,然后将待追踪数据信息和第一触发时刻写入到第一循环队列中,这样,第一追踪点被触发一次,就有一组数据写入到第一循环队列中。

在实际应用中,为了提高监控效率,待追踪数据可以被设置为二进制数据结构,这样,循环队列中存储数据为二进制数据。

步骤s14、确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;

具体地,在linux多进程中,可以在目标进程执行数据写入循环队列,在观察进程中通过共享内存的方法读取在循环队列写入的数据。首先确定第一追踪点在观察进程中与共享内存对应的第一虚拟内存地址,然后根据用户设置的事件提取函数,从第一虚拟内存地址中获取第一循环队列存储的多组待追踪数据信息和第一触发时刻。调用事件提取函数,可以将第一循环队列中存储的数据转换为用户可识别的数据,方便用户观察。

步骤s15、根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

具体地,在观察进程中,确定属于同一轨道标识的所有第一追踪点,获取上述第一追踪点记录的所有的待追踪数据信息和第一触发时刻,这样可以根据轨道标识组织显示信息,位于不同位置,但隶属于同一轨道的第一追踪点,其追踪结果可按第一触发时刻顺序交叉排序显示,有助于用户完整理解待监控程序不同组件,不同线程间的相互关系及影响。在实际应用中,可以根据轨道标识确定属于该轨道标识的所有第一追踪点标识,根据第一追踪点标识获取记录的待追踪数据信息和第一触发时刻。

例如,在网包五元组提取函数中设置第一追踪点后,在目标进程中每获取一个五元组信息,根据用户设置的追踪记录函数,将该五元组信息对应的数据结构信息和触发时间写入到第一循环队列中,在观察进程中,通过共享内存方式,根据用户设置的事件提取函数就可以获取到每一个记录的五元组数据。然后根据第一追踪点的轨道标识,就可以将这些五元组数据与其他数据相关联,进一步确定不同组件、不同线程间的相互关系及影响。

此外,通过实验数据获知,第一追踪点每次出发到写入待追踪数据信息仅需20cpu循环周期,减小追踪过程对待监控程序的影响。

本发明实施例提供的程序追踪方法,通过在目标进程中,调用用户设置的追踪记录函数,使待监控程序中的任何变量都可以成为追踪目标,将待监控程序中的待追踪数据信息和触发时刻写入到共享内存中,在目标进程中通过共享内存获取属于同一轨道的所有待追踪数据和触发时刻,无需任何外部符号文件支持,不仅支持追踪内容的历史变动记录,还提供除时间之外的维度展示追踪结果,引入的轨道维度可为待监控程序中交叉模块或交叉线程结果的追踪提供支持,方便定位软件缺陷的根本原因。

在上述实施例的基础上,进一步地,所述获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,还包括:

获取所述第一追踪点的使能标识;

相应地,所述当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间,具体为:

当所述第一追踪点被触发并且所述第一追踪点的使能标识为使能状态时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间。

具体地,用户在设置第一追踪点时,还可以设置使能标识,使能标识为1,表示第一追踪点为使能状态,可以追踪待追踪数据,使能标识为0,表示第一追踪点为非使能状态,第一追踪点关闭,不再追踪待追踪数据。

这样,在待监控程序运行到第一追踪点时,第一追踪点被触发,首先根据第一追踪点的使能标识,判断第一追踪点是否为使能状态,若是则获取第一触发时刻和第一循环队列,并调用追踪记录函数,将待追踪数据和第一触发时刻写入到第一循环队列中,在观察进程,通过共享内存获取待追踪数据的第一触发时刻之后,可以将第一追踪点的使能标识置0,关闭第一追踪点,当第一追踪点再次被触发时,由于处于非使能状态,第一追踪点不再记录追踪数据信息,但此时,之前记录的数据依然保存在第一循环队列中,可供用户随时查看。

本发明实施例提供的程序追踪方法,通过在追踪点使能状态下,在目标进程中,调用用户设置的追踪记录函数,使待监控程序中的任何变量都可以成为追踪目标,将待监控程序中的待追踪数据信息和触发时刻写入到共享内存中,在目标进程中通过共享内存获取属于同一轨道的所有待追踪数据和触发时刻,无需任何外部符号文件支持,不仅支持追踪内容的历史变动记录,还提供除时间之外的维度展示追踪结果,引入的轨道维度可为待监控程序中交叉模块或交叉线程结果的追踪提供支持,方便定位软件缺陷的根本原因,并且追踪点可动态打开或关闭,在关闭之后对待测程序无任何开销,降低程序追踪开销。

在上述各实施例的基础上,进一步地,所述当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间,包括:

当所述第一追踪点被触发时,确定第一追踪点触发事件序列号,并获取第一触发时刻;

根据所述第一追踪点触发事件序列号确定预先申请的第一循环队列中的写入队列块,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;

相应地,所述调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中,具体为:

调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述写入队列块中。

具体地,当第一追踪点被触发时,获取第一追踪点触发事件序列号,例如,在初始状态,第一追踪点的第一追踪点触发事件序列号为0,将该字段设置为单调增长的字段,当第一追踪点被触发时,第一追踪点触发事件序列号加1,并获取第一触发时刻,根据第一追踪点触发事件序列号确定本次触发对应的第一循环队列的写入队列块索引,具体地,该索引为第一追踪点触发事件序列号对循环队列长度取模所得的数值,用来标识循环队列的入队位置。

之后,调用追踪记录函数,将获取到的待追踪数据信息和第一触发时刻写入到写入队列块中,这样不同次触发第一追踪点记录的数据按触发次数依次写入到循环队列的各写入队列块中。

本发明实施例提供的程序追踪方法,通过在目标进程中,调用用户设置的追踪记录函数,将待监控程序中的待追踪数据信息和触发时刻写入到共享内存中,在目标进程中通过共享内存获取属于同一轨道的所有待追踪数据和触发时刻,无需任何外部符号文件支持,不仅支持追踪内容的历史变动记录,还提供除时间之外的维度展示追踪结果,引入的轨道维度可为待监控程序中交叉模块或交叉线程结果的追踪提供支持,方便定位软件缺陷的根本原因。

在上述各实施例的基础上,进一步地,所述方法还包括:

确定第二追踪点在所述待监控程序的第二位置和所述待监控程序中的待监控变量信息;

当所述第二追踪点被触发时,确定所述第二追踪点在目标进程中与所述共享内存对应的第二虚拟内存空间;

获取所述待监控变量信息,将所述待监控变量信息写入到所述第二虚拟内存空间中;

确定所述第二追踪点在观察进程中与所述共享内存对应的第二虚拟内存地址,从所述第二虚拟内存地址中读取所述待监控变量信息。

具体地,当用户需要实时观察待监控程序中的某个关键数据时,例如工作队列长度、内存池空闲内存大小等关键并且频繁变动的数据时,需要在待监控程序的第二位置上设置第二追踪点,该第二追踪点包括追踪点标识、追踪点名称和追踪点位置信息,以帮助用户定位。第二追踪点用户实时监控待监控变量,用户可以设置任何需要监控的长度小于预设阈值如64比特长度的变量信息,设置完第二追踪之后,确定待监控程序中的待监控变量,然后运行待监控程序,当第二追踪点被触发时,确定第二追踪点在目标进程中与共享内存对应的第二虚拟内存空间,然后获取待监控变量信息,将待监控变量信息实时写入到第二虚拟内存空间中,在观察进程中,确定第二追踪点在观察进程中与共享内存对应的第二虚拟内存地址,从第二虚拟内存地址中实时读取并显示待监控变量信息。

例如,在网包处理程序中,为满足业务需求,需要实时监控哈希表中储存的连接个数,因此需要在网包处理程序的网包处理循环起始位置设置一个第二追踪点用以监控当前实时网流总数目,当第二追踪点被触发时,获取当前实时网流总数目,然后将该数目写入到共享内存对应的目标进程的虚拟内存空间中,然后在观察进程,通过与共享内存对应的虚拟内存地址实时读取该网流数目。

本发明实施例提供的程序追踪方法,在目标进程中通过第二追踪点将待监控程序中的待监控变量信息实时写入到共享内存中,在观察进程中通过共享内存实时获取待监控变量信息,无需任何外部符号文件支持,可实现对待监控变量的实时监控,在开销最小的情况下获得待监控程序内部关键变量的实时信息,提高了对待监控程序全面监控能力。

在上述各实施例的基础上,进一步地,所述方法还包括:

确定第三追踪点在所述待监控程序的第三位置和所述待监控程序中的待测函数信息,所述待测函数用于处理目标事件;

当所述第三追踪点被触发时,获取第二触发时刻和预先申请的第二循环队列,所述第二循环队列为所述第三追踪点在目标进程中与所述共享内存对应的第三虚拟内存空间;

获取所述待测函数处理所述目标事件的处理次数和第三追踪点触发时刻,将所述处理次数和所述第三追踪点触发时刻写入到所述第二循环队列中;

确定所述第三追踪点在观察进程中与所述共享内存对应的第三虚拟内存地址,从所述第三虚拟内存地址中获取所述第二循环队列存储的处理次数和第三触发时刻;

根据所述处理次数和所述第三触发时刻,确定所述待测函数的性能。

具体地,当用户需要对测量待监控程序中循环执行的关键代码片段的处理性能时,例如在一个网包处理程序中,从接收到数据包开始,处理数据包,到处理结束并再次接收到新数据包的过程中,该代码片段的处理性能可以由处理网包总数除以处理时间求出,此时用户需要在待监控程序的第三位置设置第三追踪点,例如,在网包处理程序中,需要能够在当前作用域中读取到本次网包处理循环所处理的网包数量总数,该总数作为性能计算的参数,因此可以在网包处理程序的网包处理循环起始位置设置一个第三追踪点用以实时测量记录网包处理速率。

之后运行待监控程序,当第三追踪点被触发时,获取第二触发时刻和预先申请的第二循环队列,第二循环队列为第三追踪点在目标进程中与共享内存对应的第三虚拟内存空间,然后获取待测函数处理目标事件的处理次数和第三追踪点触发时刻,例如,网包处理循环所处理的网包数量总数,将处理次数和第三追踪点触发时刻写入到第二循环队列中。这样,第三追踪点被触发一次,就有一组性能数据按时间顺序写入到第二循环队列中。在观察进程中,确定第三追踪点在观察进程中与共享内存对应的第三虚拟内存地址,从第三虚拟内存地址中获取第二循环队列存储的处理次数和第三触发时刻,例如,获取第二循环队列中存储的两个处理次数及其对应的触发时刻,两个触发时刻相减,作为两次触发之间的间隔,配合单次处理次数可计算出上次循环时的处理性能。在一个循环队列中,队列块保存有本次触发对应的处理次数和触发时刻,触发时刻可以根据cpu硬件直接获得,对一个循环队列保存的所有处理次数,两两之间求得性能数据之后,再依据触发次数进行整体平均计算,可确定该段时间待监控程序的平均处理性能。性能单位可由用户在设置第三追踪点时指定,如在网包处理程序中可指定为pps(packetpersecond),方便用户阅读理解第三追踪点确定的性能数据。

本发明实施例提供的程序追踪方法,在第三追踪点被触发时,通过在目标进程中将待监控程序中的待测函数处理目标事件的处理次数和触发时刻写入到共享内存中,在观察进程中通过共享内存获取处理次数和触发时刻,根据处理次数和触发时刻确定待测函数的性能,无需任何外部符号文件支持,可实现对待测函数的性能测量,在开销最小的情况下获得待监控程序中待测函数的性能数据,提高了对待监控程序全面监控能力。

在上述各实施例的基础上,进一步地,所述方法还包括:

确定第三追踪点在所述待监控程序的第三位置、采样阈值和所述待监控程序中的待测函数信息,所述待测函数用于处理目标事件;

当所述第三追踪点被触发时,获取所述待测函数处理所述目标事件的处理次数并计算处理次数总和;

若所述处理次数总和达到所述采样阈值,获取第四触发时刻和预先申请的第二循环队列,所述第二循环队列为所述第三追踪点在目标进程中与所述共享内存对应的第三虚拟内存空间;

将所述处理次数总和与所述第四触发时刻写入到所述第二循环队列中;

确定所述第三追踪点在观察进程中与所述共享内存对应的第三虚拟内存地址,从所述第三虚拟内存地址中获取所述第二循环队列存储的处理次数总和与所述第四触发时刻;

根据所述处理次数总和与所述第四触发时刻,确定所述待测函数的性能。

具体地,当用户需要对测量待监控程序中循环执行的关键代码片段的处理性能时,例如在一个网包处理程序中,从接收到数据包开始,处理数据包,到处理结束并再次接收到新数据包的过程中,该代码片段的处理性能可以由处理网包总数除以处理时间求出,此时用户需要在待监控程序的第三位置设置第三追踪点,例如,在网包处理程序中,需要能够在当前作用域中读取到本次网包处理循环所处理的网包数量总数,该总数作为性能计算的参数,因此可以在网包处理程序的网包处理循环起始位置设置一个第三追踪点用以实时测量记录网包处理速率。之后,用户设置采样阈值,用于第三追踪点调整采样频率以减少对待监控程序的影响。如累积网包处理数量达到100之后,才进行一次触发时刻的获取等。

例如网包处理程序中,当接收的网包总数小于采样阈值时,仅在本地暂存当前网包总数,不进行循环队列的写入。当接收网包的总数大于采样阈值之后,获取第四触发时刻和预先申请的第二循环队列,第二循环队列为第三追踪点在目标进程中与共享内存对应的第三虚拟内存空间,将网包总数写入到第二循环队列中,并获取本次触发第三追踪点的触发时刻,将该时刻写入到第二循环队列中,之后清零本地网包计数,等到网包总数再次达到采样阈值时,进行第二次网包总数和触发时刻写入第二循环队列的操作。

之后,在观察进程,确定第三追踪点在观察进程中与述共享内存对应的第三虚拟内存地址,从第三虚拟内存地址中获取第二循环队列存储的处理次数总和与第四触发时刻,例如,获取第二循环队列中存储的相邻的两个处理次数总和及其对应的触发时刻,两个触发时刻相减,作为两次触发之间的间隔,根据第一个处理次数总和与两次触发间隔可计算出第一次触发时待测函数的处理性能。在一个循环队列中,队列块保存有本次触发对应的处理次数和触发时刻,触发时刻可以根据cpu硬件直接获得,对一个循环队列保存的所有处理次数,两两之间求得性能数据之后,再依据触发次数进行整体平均计算,可确定该段时间待监控程序的平均处理性能。性能单位可由用户在设置第三追踪点时指定,如在网包处理程序中可指定为pps(packetpersecond),方便用户阅读理解第三追踪点确定的性能数据。

本发明实施例提供的程序追踪方法,在第三追踪点被触发时,根据采样阈值通过在目标进程中将待监控程序中的待测函数处理目标事件的处理次数总和与触发时刻写入到共享内存中,减少了对待监控程序的影响,在观察进程中通过共享内存获取处理次数总和与触发时刻,根据处理次数总和与触发时刻确定待测函数的性能,无需任何外部符号文件支持,可实现对待测函数的性能测量,节省了开销,在开销最小的情况下获得待监控程序中待测函数的性能数据,提高了对待监控程序全面监控能力。

图2为本发明实施例提供的程序监控装置的结构示意图,如图2所示,该装置包括:初始化模块21、处理模块22、调用模块23、提取模块24和监控模块25,其中:

初始化模块21用于确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;处理模块22用于当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;调用模块23用于调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;提取模块24用于确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;监控模块25用于根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

具体地,当用户需要监控一个linux用户态程序时,首先确定需要追踪的数据,然后用户预先自定义待追踪数据的结构体,可以将多个待追踪数据整合到同一结构体中,然后设置追踪记录函数,在待监控程序中的第一位置上设置第一追踪点,该第一追踪点包括追踪点标识、追踪点名称和追踪点位置信息,以帮助用户定位。其中第一位置要确保第一追踪点能够获取到用户需要追踪的所有数据。之后,用户还需要确定该第一追踪点的轨道标识,这样,用户可以将多个第一追踪点通过轨道标识关联起来,可以扩展监控维度,替代单一的时间维度。当用户在第一位置上设置完第一追踪点之后,初始化模块21根据用户输入可以确定第一追踪点的位置信息,例如,第一追踪点所在待监控程序名称、所在待测程序行数以及所在函数名称等。然后获取用户设置的追踪记录函数和第一追踪点的轨道标识。当待测监控程序运行时,执行到第一追踪点时,第一追踪点被触发,此时处理模块22获取第一追踪点触发时刻,同时获取第一追踪点预先申请的第一循环队列,其中,第一循环队列为第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间,该空间为循环队列数据结构。确定第一循环队列之后,调用模块23调用用户设置的追踪记录函数,获取待追踪数据信息,然后将待追踪数据信息和第一触发时刻写入到第一循环队列中,这样,第一追踪点被触发一次,就有一组数据写入到第一循环队列中。

提取模块24首先确定第一追踪点在观察进程中与共享内存对应的第一虚拟内存地址,然后根据用户设置的事件提取函数,从第一虚拟内存地址中获取第一循环队列存储的多组待追踪数据信息和第一触发时刻。监控模块25在观察进程中,确定属于同一轨道标识的所有第一追踪点,获取上述第一追踪点记录的所有的待追踪数据信息和第一触发时刻,这样可以根据轨道标识组织显示信息,位于不同位置,但隶属于同一轨道的第一追踪点,其追踪结果可按第一触发时刻顺序交叉排序显示,有助于用户完整理解待监控程序不同组件,不同线程间的相互关系及影响。本发明实施例提供的装置,用于实现上述方法,其功能具体参照上述方法实施例,此处不再赘述。

本发明实施例提供的程序追踪装置,通过在目标进程中,调用用户设置的追踪记录函数,使待监控程序中的任何变量都可以成为追踪目标,将待监控程序中的待追踪数据信息和触发时刻写入到共享内存中,在目标进程中通过共享内存获取属于同一轨道的所有待追踪数据和触发时刻,无需任何外部符号文件支持,不仅支持追踪内容的历史变动记录,还提供除时间之外的维度展示追踪结果,引入的轨道维度可为待监控程序中交叉模块或交叉线程结果的追踪提供支持,方便定位软件缺陷的根本原因。

在上述实施例的基础上,进一步地,所述处理模块包括:

获取单元,用于当所述第一追踪点被触发时,确定第一追踪点触发事件序列号,并获取第一触发时刻;

处理单元,用于根据所述第一追踪点触发事件序列号确定预先申请的第一循环队列中的写入队列块,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;

相应地,所述调用模块具体用于:

调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述写入队列块中。

具体地,当第一追踪点被触发时,获取单元获取第一追踪点触发事件序列号,例如,在初始状态,第一追踪点的第一追踪点触发事件序列号为0,将该字段设置为单调增长的字段,当第一追踪点被触发时,获取单元将第一追踪点触发事件序列号加1,并获取第一触发时刻,处理单元根据第一追踪点触发事件序列号确定本次触发对应的第一循环队列的写入队列块索引,具体地,该索引为第一追踪点触发事件序列号对循环队列长度取模所得的数值,用来标识循环队列的入队位置。

之后,调用模块调用追踪记录函数,将获取到的待追踪数据信息和第一触发时刻写入到写入队列块中,这样不同次触发第一追踪点记录的数据按触发次数依次写入到循环队列的各写入队列块中。本发明实施例提供的装置,用于实现上述方法,其功能具体参照上述方法实施例,此处不再赘述。

本发明实施例提供的程序追踪装置,通过在目标进程中,调用用户设置的追踪记录函数,将待监控程序中的待追踪数据信息和触发时刻写入到共享内存中,在目标进程中通过共享内存获取属于同一轨道的所有待追踪数据和触发时刻,无需任何外部符号文件支持,不仅支持追踪内容的历史变动记录,还提供除时间之外的维度展示追踪结果,引入的轨道维度可为待监控程序中交叉模块或交叉线程结果的追踪提供支持,方便定位软件缺陷的根本原因。

图3为本发明实施例提供的电子设备的结构示意图,如图3所示,所述设备包括:处理器(processor)301、存储器(memory)302和总线303;

其中,处理器301和存储器302通过所述总线303完成相互间的通信;

处理器301用于调用存储器302中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

本发明实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

本发明实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:确定第一追踪点在待监控程序的第一位置,获取用户设置的追踪记录函数和所述第一追踪点的轨道标识,所述追踪记录函数用于获取所述待监控程序中的待追踪数据信息,所述轨道标识用于关联至少两个所述第一追踪点;当所述第一追踪点被触发时,获取第一触发时刻和预先申请的第一循环队列,所述第一循环队列为所述第一追踪点在目标进程中与共享内存对应的第一虚拟内存空间;调用所述追踪记录函数,将获取到的所述待追踪数据信息和所述第一触发时刻写入所述第一循环队列中;确定所述第一追踪点在观察进程中与所述共享内存对应的第一虚拟内存地址,根据用户设置的事件提取函数,从所述第一虚拟内存地址中获取所述第一循环队列存储的待追踪数据信息和第一触发时刻;根据所述轨道标识,确定属于所述轨道标识的所有第一追踪点的待追踪数据信息和第一触发时刻。

需要说明的是,本发明实施例中所有使用“第一”和“第二”等的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”等仅为了表述的方便,不应理解为对本发明实施例的限定。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。

以上所描述的装置等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上各实施例仅用以说明本发明的实施例的技术方案,而非对其限制;尽管参照前述各实施例对本发明的实施例进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明的实施例各实施例技术方案的范围。

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