基于制造技术

技术编号:39502470 阅读:12 留言:0更新日期:2023-11-24 11:33
本发明专利技术公开了一种基于

【技术实现步骤摘要】
基于kprobe的linux内核动态调试方法及系统


[0001]本专利技术涉及计算机领域,尤其涉及一种基于
kprobe

linux
内核动态调试方法及系统


技术介绍

[0002]在某些情况下,调试
Linux
系统时,内核输出信息有限,存在观测性不足的问题,用户无法根据这些有限的信息进行故障调试和性能分析

[0003]当前故障调试和性能分析的方法主要有
ftrace、ebpf
及其高阶扩展如
bcc


这些方法均能够很好的拓宽内核的可观性,使用起来也十分便利,但是从框架上看存在用户空间和内核空间的数据交互,用户从用户空间读取数据

这就导致当系统宕机时,用户就无法获取到有用数据;因此为了全方位尽可能的检测内核行为,用户只能使用的
kprobe
来对内核函数进行动态插桩,以便在系统宕机时得到一些有用信息

[0004]然而使用
kprobe
也存在一些无法避免的问题,首先使用
kprobe
需要开发内核模块,而一般用于故障调试的插桩点是非常不固定的,这导致使用起来效率极低;此外如果需要插桩到函数内部,则需要十分了解汇编代码,导致使用起来非常不便

基于上述原因,直接使用
kprboe
散失了便利性,大多数开发人员会选择在内核或内核模块源码中添加调试信息,然后编译替换内核或模块进行调试


技术实现思路

[0005]本专利技术要解决的技术问题就在于:针对现有技术存在的技术问题,本专利技术提供一种基于
kprobe

linux
内核动态调试方法及系统,降低了使用
kprobe
进行
linux
系统调试的门槛并提高了开发效率

[0006]为解决上述技术问题,本专利技术提出的技术方案为:一种基于
kprobe

linux
内核动态调试方法,包括以下步骤:
S1
)获取目标函数的配置项;
S2
)根据所述配置项中的探测方式确定偏移地址列表;
S3
)将目标函数的配置项转换为代码字符串数据,并根据所述偏移地址列表中的偏移地址存入对应的代码数据集;
S4
)根据所述探测方式调用指定的模板,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据,得到目标函数新的模块文件,所述模板为
kretprobe
模板或者
kprobe
模板;
S5
)将所述模块文件加载到
linux
内核中进行调试

[0007]进一步的,步骤
S2
具体包括:如果探测方式为跟踪函数入口地址或跟踪函数返回值,则设置对应的偏移地址为0,并存入偏移地址列表;如果探测方式为跟踪函数中子函数跳转点

函数返回点

源码位置运行点中任意一种,则反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表

[0008]进一步的,反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表时,包括以下步骤:
S21
)反编译内核镜像或目标函数的模块文件为汇编文件,在汇编文件中提取目标函数的汇编代码;
S22
)如果探测方式为跟踪函数中子函数跳转点,分析所述汇编代码并寻找子函数调用指令,计算每个指令地址与函数入口地址的差值后填入偏移地址列表中,同时生成子函数名与地址的信息映射表;如果探测方式为跟踪函数返回点,分析所述汇编代码并寻找函数返回指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成返回点处源码信息与地址的信息映射表;如果探测方式为源码位置运行点,分析所述汇编代码并寻找带有源码位置信息的下一条指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成源码信息与地址的信息映射表

[0009]进一步的,步骤
S3
具体包括以下步骤:
S31
)新建代码数据集,从偏移地址列表取出当前偏移地址,将当前偏移地址与目标函数的函数名组成标识符,并存入代码数据集;
S32
)解析所述配置项中的过滤方法,转换成对应
C
代码字符串,并存入代码数据集中;
S33
)解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应
C
代码字符串,并存入代码数据集中,将所述代码数据集存入代码数据集列表;
S34
)若所述偏移地址列表遍历完成,则跳转执行步骤
S4
,否则跳转执行步骤
S31。
[0010]进一步的,步骤
S32
中解析所述配置项中的过滤方法,转换成对应
C
代码字符串时,包括以下步骤:
S321
)获取过滤方法数据和当前偏移地址,解析过滤方法中的全局过滤属性,并转换成相应的
C
代码字符串数据;
S322
)如果当前偏移地址为0,解析过滤方法中的入参过滤属性,并转换成相应的
C
代码字符串数据

[0011]进一步的,步骤
S33
中解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应
C
代码字符串时,包括以下步骤:
S331
)获取信息输出属性

指针数据修改属性

标识符和当前偏移地址,解析信息输出属性中的全局输出属性,获取输出方式,将所述全局输出属性和标识符根据所述输出方式进行
c
代码字符串转换,得到对应的
C
代码字符串数据和头文件数据;
S332
)如果当前偏移地址为0,则解析信息输出属性中的入参输出属性,并结合标识符根据所述输出方式进行
c
代码字符串转换,得到对应的
C
代码字符串数据和头文件数据;然后解析指针数据修改属性目中的入参修改属性并进行
c
代码字符串转换,得到对应的
C
代码字符串数据

[0012]进一步的,步骤
S4
中,根据所述探测方式调用指定的模板时,包括:若所述探测方式为跟踪函数返回值,则调用
kretprobe
模板,否则调用
kprobe
模板

[0013]进一步的,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据时,包括:增加模板中头文件信息为代码数据集中的头文本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.
一种基于
kprobe

linux
内核动态调试方法,其特征在于,包括以下步骤:
S1
)获取目标函数的配置项;
S2
)根据所述配置项中的探测方式确定偏移地址列表;
S3
)将目标函数的配置项转换为代码字符串数据,并根据所述偏移地址列表中的偏移地址存入对应的代码数据集;
S4
)根据所述探测方式调用指定的模板,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据,得到目标函数新的模块文件,所述模板为
kretprobe
模板或者
kprobe
模板;
S5
)将所述模块文件加载到
linux
内核中进行调试
。2.
根据权利要求1所述的基于
kprobe

linux
内核动态调试方法,其特征在于,步骤
S2
具体包括:如果探测方式为跟踪函数入口地址或跟踪函数返回值,则设置对应的偏移地址为0,并存入偏移地址列表;如果探测方式为跟踪函数中子函数跳转点

函数返回点

源码位置运行点中任意一种,则反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表
。3.
根据权利要求2所述的基于
kprobe

linux
内核动态调试方法,其特征在于,反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表时,包括以下步骤:
S21
)反编译内核镜像或目标函数的模块文件为汇编文件,在汇编文件中提取目标函数的汇编代码;
S22
)如果探测方式为跟踪函数中子函数跳转点,分析所述汇编代码并寻找子函数调用指令,计算每个指令地址与函数入口地址的差值后填入偏移地址列表中,同时生成子函数名与地址的信息映射表;如果探测方式为跟踪函数返回点,分析所述汇编代码并寻找函数返回指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成返回点处源码信息与地址的信息映射表;如果探测方式为源码位置运行点,分析所述汇编代码并寻找带有源码位置信息的下一条指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成源码信息与地址的信息映射表
。4.
根据权利要求1所述的基于
kprobe

linux
内核动态调试方法,其特征在于,步骤
S3
具体包括以下步骤:
S31
)新建代码数据集,从偏移地址列表取出当前偏移地址,将当前偏移地址与目标函数的函数名组成标识符,并存入代码数据集;
S32
)解析所述配置项中的过滤方法,转换成对应
C
代码字符串,并存入代码数据集中;
S33
)解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应
C
代码字符串,并存入代码数据集中;
S34
)若所述偏移地址列表遍历完成,则跳转执行步骤
S4
,否则跳转执行步骤
S31。5.
根据权利要求4所述的基于
kprobe

linux
内核动态调试方法,其特征在于,步骤
S32
中解析所述配置项中的过滤方法,转换成对应
C
代码字符串时,包括以下步骤:
S321
)获取过滤方法数据和当前偏移地址,解析过滤方法中的全局过滤属性,并转...

【专利技术属性】
技术研发人员:田亚雄孙立明熊鑫王琦
申请(专利权)人:麒麟软件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1