基于linux共享内存数据镜像的程序跟踪方法和系统与流程

文档序号:20204412发布日期:2020-03-27 20:59阅读:524来源:国知局
基于linux共享内存数据镜像的程序跟踪方法和系统与流程

本发明涉及数据调试领域,尤其涉及一种基于linux共享内存数据镜像的程序跟踪方法和系统。



背景技术:

目前大部分的linux程序常规调试有gdb、加printf输出日志等方法打印一些开发人员或者维护人员需要关注的固定信息,这些方法确实非常实用和高效,是linux平台下程序员常用的调试方法,但是这些方法在应用程序会增加额外的开销,所以在正式版本中,可能会关闭调试代码。



技术实现要素:

本发明要解决的技术问题在于,提供一种新的调试方法,可以便于用户实时查看程序运行时的内部变量数据的当前值和状态变化情况,而且调试过程不会影响程序内部的变量数值和原程序的运行结果。

本发明解决其技术问题所采用的技术方案是:构造一种基于linux共享内存数据镜像的程序跟踪方法,所述方法包括:

被跟踪程序在系统中创建一份程序的原本内部变量空间后,通过linux的shmget、shmat系统函数创建共享内存空间,所述共享内存空间作为所述原本内部变量空间的一个副本;

被跟踪程序在运行中对变量的数据内容进行修改时,同步修改所述共享内存空间中的变量副本的数据内容;

调试工具通过shmget、shmat系统函数找到并连接所述共享内存空间,并在收到调试跟踪指令时读取所述共享内存空间中的变量副本的数据内容。

优选地,所述的通过linux的shmget、shmat系统函数创建共享内存空间,包括:

定义用于指向所述共享内存空间的数据指针;

通过shmget系统函数创建一份同原本内部变量空间的副本作为所述共享内存空间;

通过shmat系统函数将所述共享内存空间映射到所述数据指针上。

优选地,所述的同步修改所述共享内存空间中的变量副本的数据内容,包括:

在被跟踪程序在运行中对某个变量的数据内容进行修改后,通过所述数据指针找到所述某个变量的变量副本,并将所述某个变量的数据内容赋值给所述变量副本。

优选地,所述的调试工具通过shmget、shmat系统函数找到并连接所述共享内存空间,包括:

调试工具定义用于指向所述共享内存空间的数据指针;

通过shmget系统函数得到被跟踪程序所创建的所述共享内存空间;

通过shmat系统函数将所述共享内存空间映射到所述数据指针上,并以只读方式连接到所述共享内存空间映上。

本发明另一方面还公开了一种基于linux共享内存数据镜像的程序跟踪系统,包括运行于系统上的被跟踪程序和调试工具,

所述被跟踪程序包括:共享内存空间创建模块,用于在系统中创建一份程序的原本内部变量空间后,通过linux的shmget、shmat系统函数创建共享内存空间,所述共享内存空间作为所述原本内部变量空间的一个副本;变量同步模块,用于在被跟踪程序在运行中对变量的数据内容进行修改时,同步修改所述共享内存空间中的变量副本的数据内容;

所述调试工具包括:共享内存空间连接模块,用于通过shmget、shmat系统函数找到并连接所述共享内存空间;变量跟踪模块,用于在收到调试跟踪指令时读取所述共享内存空间中的变量副本的数据内容。

优选地,所述共享内存空间创建模块具体用于定义用于指向所述共享内存空间的数据指针,通过shmget系统函数创建一份同原本内部变量空间的副本作为所述共享内存空间,通过shmat系统函数将所述共享内存空间映射到所述数据指针上。

优选地,所述变量同步模块具体用于在被跟踪程序在运行中对某个变量的数据内容进行修改后,通过所述数据指针找到所述某个变量的变量副本,并将所述某个变量的数据内容赋值给所述变量副本。

优选地,所述共享内存空间连接模块具体用于定义用于指向所述共享内存空间的数据指针,通过shmget系统函数得到被跟踪程序所创建的所述共享内存空间,通过shmat系统函数将所述共享内存空间映射到所述数据指针上,并以只读方式连接到所述共享内存空间映上。

本发明的基于linux共享内存数据镜像的程序跟踪方法和系统,具有以下有益效果:本发明的方法可以实时查看被跟踪程序运行时的内部变量数据的当前值和状态变化情况,而且调试过程不会影响程序内部的变量数值和原程序的运行结果,不用对被跟踪程序进行大的改动,调试非常灵活,程序员随时都可以通过调试工具对其数据进行查看,而不像一般调试那样需要断点或指定的程序位置或指定时间才打印指定的数据值到日志,可以实现对被跟踪程序的变量实时查看和跟踪。

附图说明

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

图1是本发明基于linux共享内存数据镜像的程序跟踪方法的流程图;

图2是本发明基于linux共享内存数据镜像的程序跟踪方法的原理图。

具体实施方式

为了便于理解本发明,下面将参照相关附图对本发明进行更全面的描述。附图中给出了本发明的典型实施例。但是,本发明可以以许多不同的形式来实现,并不限于本文所描述的实施例。相反地,提供这些实施例的目的是使对本发明的公开内容更加透彻全面。应当理解本发明实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本发明实施例以及实施例中的技术特征可以相互组合。

除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。

实施例一

参考图1、2,本发明实施例一提供一种基于linux共享内存数据镜像的程序跟踪方法,所述方法包括:

s101、被跟踪程序在系统中创建一份程序的原本内部变量空间后,通过linux的shmget、shmat系统函数创建共享内存空间,所述共享内存空间作为所述原本内部变量空间的一个副本;

s102、被跟踪程序在运行中对变量的数据内容进行修改时,同步修改所述共享内存空间中的变量副本的数据内容;

s103、调试工具通过shmget、shmat系统函数找到并连接所述共享内存空间,并在收到调试跟踪指令时读取所述共享内存空间中的变量副本的数据内容。

其中,步骤s101中所述的通过linux的shmget、shmat系统函数创建共享内存空间,包括:定义用于指向所述共享内存空间的数据指针;通过shmget系统函数创建一份同原本内部变量空间的副本作为所述共享内存空间;通过shmat系统函数将所述共享内存空间映射到所述数据指针上。

比如,为便于说明,下面以单个变量结构说明,假设之前变量结构体是canlongframe,数据指针定义为canlongframe*debug_can_long_frame=0,则可以通过debug_shm=shmget((key_t)123,sizeof(canlongframe),ipc_creat|0666)来创建一份同canlongframe结构体大小的共享内存数据块。之后,再利用debug_can_long_frame=(canlongframe*)shmat(debug_shm,(constvoid*)0,0)将共享内存空间映射到debug_can_long_frame指针上。

步骤s102中,所述的同步修改所述共享内存空间中的变量副本的数据内容,包括:在被跟踪程序在运行中对某个变量的数据内容进行修改后,通过所述数据指针找到所述某个变量的变量副本,并将所述某个变量的数据内容赋值给所述变量副本。

步骤s103中,所述的调试工具通过shmget、shmat系统函数找到并连接所述共享内存空间,包括:调试工具定义用于指向所述共享内存空间的数据指针;通过shmget系统函数得到被跟踪程序所创建的所述共享内存空间;通过shmat系统函数将所述共享内存空间映射到所述数据指针上,并以只读方式连接到所述共享内存空间映上。

具体的,可以根据与被跟踪程序约定好的共享内存标志号key、共享内存块大小size、以及共享数据块的结构体,通过shmget、shmat系统函数进行连接。比如,在调试工具中通过canlongframe*debug_can_long_frame=0定义数据指针,通过debug_shm=shmget((key_t)123,sizeof(canlongframe),0666)得到被跟踪程序所创建的共享内存空间,然后通过debug_can_long_frame=(canlongframe*)shmat(debug_shm,(constvoid*)0,shm_rdonly)来实现以只读方式连接共享内存空间上。

可见,本实施例具有如下的有益效果:对被跟踪程序上,增加此共享内存数据镜像的调试方法非常简单和便捷,不用对原被跟踪程序进行大的改动;调试非常灵活,被跟踪程序中的内部数据变量,程序员随时都可以通过调试跟踪软件对其数据进行查看,而不像一般调试那样需要断点或指定的程序位置或指定时间才打印指定的数据值到日志;可以实现对被跟踪程序的变量实时查看和跟踪。

实施例二

本实施例公开了一种基于linux共享内存数据镜像的程序跟踪系统,包括运行于系统上的被跟踪程序和调试工具,

所述被跟踪程序包括:共享内存空间创建模块,用于在系统中创建一份程序的原本内部变量空间后,通过linux的shmget、shmat系统函数创建共享内存空间,所述共享内存空间作为所述原本内部变量空间的一个副本;变量同步模块,用于在被跟踪程序在运行中对变量的数据内容进行修改时,同步修改所述共享内存空间中的变量副本的数据内容;

所述调试工具包括:共享内存空间连接模块,用于通过shmget、shmat系统函数找到并连接所述共享内存空间;变量跟踪模块,用于在收到调试跟踪指令时读取所述共享内存空间中的变量副本的数据内容。

具体的,所述共享内存空间创建模块具体用于定义用于指向所述共享内存空间的数据指针,通过shmget系统函数创建一份同原本内部变量空间的副本作为所述共享内存空间,通过shmat系统函数将所述共享内存空间映射到所述数据指针上。

具体的,所述变量同步模块具体用于在被跟踪程序在运行中对某个变量的数据内容进行修改后,通过所述数据指针找到所述某个变量的变量副本,并将所述某个变量的数据内容赋值给所述变量副本。

具体的,所述共享内存空间连接模块具体用于定义用于指向所述共享内存空间的数据指针,通过shmget系统函数得到被跟踪程序所创建的所述共享内存空间,通过shmat系统函数将所述共享内存空间映射到所述数据指针上,并以只读方式连接到所述共享内存空间映上。

更多内容可以参考实施例一,此处不再赘述。

综上所述,本发明的基于linux共享内存数据镜像的程序跟踪方法和系统,具有以下有益效果:本发明的方法可以实时查看被跟踪程序运行时的内部变量数据的当前值和状态变化情况,而且调试过程不会影响程序内部的变量数值和原程序的运行结果,不用对被跟踪程序进行大的改动,调试非常灵活,程序员随时都可以通过调试工具对其数据进行查看,而不像一般调试那样需要断点或指定的程序位置或指定时间才打印指定的数据值到日志,可以实现对被跟踪程序的变量实时查看和跟踪。

上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。

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