CN117076338A - 基于kprobe的linux内核动态调试方法及系统 - Google Patents

基于kprobe的linux内核动态调试方法及系统 Download PDF

Info

Publication number
CN117076338A
CN117076338A CN202311345573.3A CN202311345573A CN117076338A CN 117076338 A CN117076338 A CN 117076338A CN 202311345573 A CN202311345573 A CN 202311345573A CN 117076338 A CN117076338 A CN 117076338A
Authority
CN
China
Prior art keywords
code
data
template
function
offset address
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202311345573.3A
Other languages
English (en)
Other versions
CN117076338B (zh
Inventor
田亚雄
孙立明
熊鑫
王�琦
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Kirin Software Co Ltd
Original Assignee
Kirin Software Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Kirin Software Co Ltd filed Critical Kirin Software Co Ltd
Priority to CN202311345573.3A priority Critical patent/CN117076338B/zh
Publication of CN117076338A publication Critical patent/CN117076338A/zh
Application granted granted Critical
Publication of CN117076338B publication Critical patent/CN117076338B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种基于kprobe的linux内核动态调试方法及系统,包括以下步骤:获取目标函数的配置项;根据所述配置项中的探测方式确定偏移地址列表;将目标函数的配置项转换为代码字符串数据,并根据所述偏移地址列表中的偏移地址存入对应的代码数据集;根据所述探测方式调用指定的模板,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据,得到目标函数新的模块文件,所述模板为kretprobe模板或者kprobe模板;将所述模块文件加载到linux内核中进行调试。本发明降低了使用kprobe进行linux系统调试的门槛并提高了开发效率。

Description

基于kprobe的linux内核动态调试方法及系统
技术领域
本发明涉及计算机领域,尤其涉及一种基于kprobe的linux内核动态调试方法及系统。
背景技术
在某些情况下,调试Linux系统时,内核输出信息有限,存在观测性不足的问题,用户无法根据这些有限的信息进行故障调试和性能分析。
当前故障调试和性能分析的方法主要有ftrace、ebpf及其高阶扩展如bcc等。这些方法均能够很好的拓宽内核的可观性,使用起来也十分便利,但是从框架上看存在用户空间和内核空间的数据交互,用户从用户空间读取数据。这就导致当系统宕机时,用户就无法获取到有用数据;因此为了全方位尽可能的检测内核行为,用户只能使用的kprobe来对内核函数进行动态插桩,以便在系统宕机时得到一些有用信息。
然而使用kprobe也存在一些无法避免的问题,首先使用kprobe需要开发内核模块,而一般用于故障调试的插桩点是非常不固定的,这导致使用起来效率极低;此外如果需要插桩到函数内部,则需要十分了解汇编代码,导致使用起来非常不便。基于上述原因,直接使用kprboe散失了便利性,大多数开发人员会选择在内核或内核模块源码中添加调试信息,然后编译替换内核或模块进行调试。
发明内容
本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种基于kprobe的linux内核动态调试方法及系统,降低了使用kprobe进行linux系统调试的门槛并提高了开发效率。
为解决上述技术问题,本发明提出的技术方案为:
一种基于kprobe的linux内核动态调试方法,包括以下步骤:
S1)获取目标函数的配置项;
S2)根据所述配置项中的探测方式确定偏移地址列表;
S3)将目标函数的配置项转换为代码字符串数据,并根据所述偏移地址列表中的偏移地址存入对应的代码数据集;
S4)根据所述探测方式调用指定的模板,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据,得到目标函数新的模块文件,所述模板为kretprobe模板或者kprobe模板;
S5)将所述模块文件加载到linux内核中进行调试。
进一步的,步骤S2具体包括:如果探测方式为跟踪函数入口地址或跟踪函数返回值,则设置对应的偏移地址为0,并存入偏移地址列表;如果探测方式为跟踪函数中子函数跳转点、函数返回点、源码位置运行点中任意一种,则反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表。
进一步的,反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表时,包括以下步骤:
S21)反编译内核镜像或目标函数的模块文件为汇编文件,在汇编文件中提取目标函数的汇编代码;
S22)如果探测方式为跟踪函数中子函数跳转点,分析所述汇编代码并寻找子函数调用指令,计算每个指令地址与函数入口地址的差值后填入偏移地址列表中,同时生成子函数名与地址的信息映射表;
如果探测方式为跟踪函数返回点,分析所述汇编代码并寻找函数返回指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成返回点处源码信息与地址的信息映射表;
如果探测方式为源码位置运行点,分析所述汇编代码并寻找带有源码位置信息的下一条指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成源码信息与地址的信息映射表。
进一步的,步骤S3具体包括以下步骤:
S31)新建代码数据集,从偏移地址列表取出当前偏移地址,将当前偏移地址与目标函数的函数名组成标识符,并存入代码数据集;
S32)解析所述配置项中的过滤方法,转换成对应C代码字符串,并存入代码数据集中;
S33)解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应C代码字符串,并存入代码数据集中,将所述代码数据集存入代码数据集列表;
S34)若所述偏移地址列表遍历完成,则跳转执行步骤S4,否则跳转执行步骤S31。
进一步的,步骤S32中解析所述配置项中的过滤方法,转换成对应C代码字符串时,包括以下步骤:
S321)获取过滤方法数据和当前偏移地址,解析过滤方法中的全局过滤属性,并转换成相应的C代码字符串数据;
S322)如果当前偏移地址为0,解析过滤方法中的入参过滤属性,并转换成相应的C代码字符串数据。
进一步的,步骤S33中解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应C代码字符串时,包括以下步骤:
S331)获取信息输出属性、指针数据修改属性、标识符和当前偏移地址,解析信息输出属性中的全局输出属性,获取输出方式,将所述全局输出属性和标识符根据所述输出方式进行c代码字符串转换,得到对应的C代码字符串数据和头文件数据;
S332)如果当前偏移地址为0,则解析信息输出属性中的入参输出属性,并结合标识符根据所述输出方式进行c代码字符串转换,得到对应的C代码字符串数据和头文件数据;
然后解析指针数据修改属性目中的入参修改属性并进行c代码字符串转换,得到对应的C代码字符串数据。
进一步的,步骤S4中,根据所述探测方式调用指定的模板时,包括:若所述探测方式为跟踪函数返回值,则调用kretprobe模板,否则调用kprobe模板。
进一步的,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据时,包括:
增加模板中头文件信息为代码数据集中的头文件数据;
替换模板中的挂载函数为代码数据集中的函数名;
替换模板中的挂载函数的偏移地址点为代码数据集中的偏移地址;
替换模板中的过滤信息部分为代码数据集中过滤方法对应的C代码字符串;
替换模板中的输出信息部分为代码数据集中信息输出属性对应的C代码字符串;
替换模板中的修改信息部分为代码数据集中入参修改属性对应的C代码字符串;
替换模板Makefile文件中文件名相关数据为代码数据集中的标识符;
输出为文件名为标识符的.c文件,和对应的Makerfile文件;
如果为trace输出,则根据代码数据集中trace头文件数据,生成trace头文件,并将需要包含的头文件信息写入模板中。
本发明还提出一种基于kprobe的linux内核动态调试系统,包括互相连接的微处理器和存储介质,所述微处理器被编程或配置以执行任一所述的基于kprobe的linux内核动态调试方法。
本发明还提出一种计算机可读存储介质,所述计算机可读存储介质存储有被编程或配置以执行任一所述的基于kprobe的linux内核动态调试方法的计算机程序。
与现有技术相比,本发明的优点在于:
1.通过获取函数的探测方式来确定偏移地址列表,实现了函数内部常用的插桩探测点的自动分析,方便在函数内部插桩探测且无需人工分析汇编代码;同时也无需了解kprobe/kretprobe模块开发知识。
2.根据偏移地址列表,将函数的配置项转换为代码数据,并导入指定的模板中生成模块文件,用户无需繁琐的模块开发,即可监控插桩点有条件或无条件的触发探测、参数值、全局变量的信息输出,以及入参指针指向数据的修改。
附图说明
图1为本发明实施例的流程图。
图2为本发明实施例中生成代码数据集的流程图。
图3 为本发明实施例中生成过滤方法对应C代码字符串的流程图。
图4 为本发明实施例中生成信息输出属性和指针数据修改属性生成对应C代码字符串的流程图。
图5 为本发明实施例中生成模块文件的流程图。
具体实施方式
以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
实施例一
本实施例提出一种基于kprobe的linux内核动态调试方法,能够使用kprobe高效的对linux内核进行调试,如图1所示,包括以下步骤:
S1)获取目标函数的配置项,本实施例中,配置项具体包括函数名、探测方式、过滤方法、信息输出属性、指针数据修改属性;
S2)根据所述配置项中的探测方式确定偏移地址列表;
S3)将目标函数的配置项转换为代码字符串数据,并根据所述偏移地址列表中的偏移地址存入对应的代码数据集,然后将所有代码数据集存入代码数据集列表中;
S4)根据所述探测方式调用指定的模板,遍历代码数据集列表,分别将每个代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据,生成并编译目标函数新的模块文件,指定的模板为kretprobe模板或者kprobe模板;
S5)将所述模块文件加载到linux内核中进行调试,用户可通过控制台、trace查看探针触发的信息,同时也能修改入参和全局指针指向的数据。
通过上述步骤,本实施例的方法能够显著提升调试效率,解决使用kprobe时繁琐的开发步骤;用户无需掌握汇编语言,便可在函数内部加入探点;相较于ebpf、bcc、trace等高级调试探测方案,在系统宕机的情况下更加合适。
下面对于每一步骤进行具体说明。
本实施例的步骤S2根据探测方式和分析汇编代码生成偏移地址列表,具体包括:
如果探测方式为跟踪函数入口地址或跟踪函数返回值,则设置对应的偏移地址为0,并存入偏移地址列表;
如果探测方式为跟踪函数中子函数跳转点、函数返回点、源码位置运行点中任意一种,则反编译内核镜像或目标函数的模块文件并提取对应的偏移地址,将提取的偏移地址存入偏移地址列表,包括以下步骤:
S21)反编译内核镜像或目标函数的模块文件为汇编文件,在汇编文件中提取目标函数的汇编代码;
S22)如果探测方式为跟踪函数中子函数跳转点,分析所述汇编代码并寻找子函数调用指令,计算每个指令地址与函数入口地址的差值后填入偏移地址列表中,同时生成子函数名与地址的信息映射表;
如果探测方式为跟踪函数返回点,分析所述汇编代码并寻找函数返回指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成返回点处源码信息与地址的信息映射表;
如果探测方式为源码位置运行点,分析所述汇编代码并寻找带有源码位置信息的下一条指令,计算每个指令点地址与函数入口地址的差值填入偏移地址列表中,同时生成源码信息与地址的信息映射表。
本实施例通过步骤S3,将偏移地址列表中的偏移地址和所获取的目标函数的配置项转化为C代码字符串数据,如图2所示,本实施例的步骤S3具体包括以下步骤:
S31)新建代码数据集,从偏移地址列表取出当前偏移地址,将当前偏移地址与目标函数的函数名组成标识符,并存入代码数据集;
如图3所示,首先获取配置项中的函数名,记为symbol_name,并获取偏移地址列表记为addr_list,然后从偏移地址列表addr_list中取出一个偏移地址,记为addr,并新建代码数据集,记为code,将偏移地址addr与函数名symbol_name组成标识符,记为detect_key,最后将标识符detect_key以及配置项中的探测方式存入代码数据集code中。
进一步的,如图3所示,将当前偏移地址与目标函数的函数名组成标识符之前,还获取并解析源码信息映射表,将目标函数的函数名、偏移地址和探测方式匹配源码信息映射表得到对应的源码,结合源码生成头文件信息,并存入代码数据集code中。
S32)解析所述配置项中的过滤方法,转换成对应C代码字符串,并存入代码数据集中;
S33)解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应C代码字符串,并存入代码数据集中,将所述代码数据集存入代码数据集列表;
S34)若所述偏移地址列表遍历完成,则结束并跳转执行步骤S4,否则跳转执行步骤S31。
如图3所示,步骤S32中解析所述配置项中的过滤方法,转换成对应C代码字符串时,包括以下步骤:
S321)获取过滤方法数据和当前偏移地址addr,解析过滤方法中的全局过滤属性,并转换成相应的C代码字符串数据;
S322)如果当前偏移地址addr为0,解析过滤方法中的入参过滤属性,并转换成相应的C代码字符串数据。
如图4所示,步骤S33中解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应C代码字符串时,包括以下步骤:
S331)获取信息输出属性、指针数据修改属性、标识符和当前偏移地址addr,解析信息输出属性中的全局输出属性,记为global_msg,获取输出方式,将所述全局输出属性global_msg和标识符detect_key根据所述输出方式进行c代码字符串转换,得到对应的C代码字符串数据和头文件数据;
本实施例中,输出方式包括printk()输出(打印输出)和trace输出,根据printk()输出进行c代码字符串转换,即进行printk()输出的c代码字符串转换后,仅得到对应的C代码字符串数据,而根据trace输出进行c代码字符串转换,即进行trace输出的c代码字符串转换后,除了得到对应的C代码字符串数据,还额外生成相应头文件数据。
S332)如果当前偏移地址addr为0,则解析信息输出属性中的入参输出属性,并结合标识符detect_key根据所述输出方式进行c代码字符串转换,得到对应的C代码字符串数据和头文件数据;
如前所述,进行printk()输出的c代码字符串转换后,仅得到对应的C代码字符串数据,进行trace输出的c代码字符串转换后,除了得到对应的C代码字符串数据,还额外生成相应头文件数据;
然后解析指针数据修改属性目中的入参修改属性并进行c代码字符串转换,得到对应的C代码字符串数据。指针数据修改属性目的在于修改指针指向的数据,一种是函数的入参、一种是内核中的全局变量地址。解析这些属性并转换为printk()输出或trace输出的c代码字符串。
前文中所述的全局过滤属性、全局输出属性是指内核模块可得到的全局变量或通过函数得到的数据,包含且不限于当前运行的CPU号、进程号、内核时间;入参过滤属性、入参输出属性是指探测函数入口处的传参;它们的解析与转换方法是通过符号规则表进行;他们生成的C代码字符串均包含需要包含的头文件,这部分结合内核源码信息分析给出。
本实施例的步骤S4根据一定规则,使用字符串数据并调用指定模板生成一列模块文件并编译,如图5所示,其包括以下步骤:
S41)获取代码数据集列表,记为code_list,从代码数据集列表code_list中取出当前代码数据集code,并判断当前代码数据集code中的探测方式是否为跟踪函数返回值,若所述探测方式为跟踪函数返回值,则调用kretprobe模板,否则调用kprobe模板;本实施例中,kprobe/kretprobe模板为一组能够通过改变部分数据的内核模块源文件。其中函数名代表函数挂载点即struct kprobe或struct kretprobe中的symbol成员;偏移地址为struct kprobe中的offset成员; 过滤信息一般放在处理函数的最前面,当判断不满足条件时不再输出后面的信息;输出信息放在过滤信息之后,输出触发探针后的信息;修改信息为修改入参指针所有指向的数据,进而影响被挂载函数后续行为;
S42)将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据,如图5所示,包括:
1)增加模板c代码文件中头文件信息为代码数据集code中的头文件数据;
2)替换模板c代码文件中的挂载函数为代码数据集code中的函数名symbol_name;
3)替换模板c代码文件中的挂载函数的偏移地址点为代码数据集code对应的偏移地址addr;
4)替换模板c代码文件中的过滤信息部分为代码数据集code中过滤方法对应的C代码字符串;
5)替换模板c代码文件中的输出信息部分为代码数据集code中信息输出属性对应的C代码字符串;
6)替换模板c代码文件中的修改信息部分为代码数据集code中入参修改属性对应的C代码字符串;
7)替换模板Makefile文件中文件名相关数据为代码数据集code中的标识符;
8)输出为文件名为标识符的.c文件,和对应的Makerfile文件;
9)如果输出方式为trace输出,则根据代码数据集code中trace头文件数据,生成trace头文件,并将需要包含的头文件信息写入模板中;
S43)判断代码数据集列表code_list是否遍历完毕,是则结束并将替换代码数据集中的代码字符串数据的模板进行编译得到模块文件,跳转执行步骤S5,否则跳转执行步骤S41以从代码数据集列表code_list中取出下一代码数据集来替换下一模板中的原始数据。
以对某个内核函数:为例,并结合相应场景,对本实施例的方法的应用进行说明。
假设用户需要跟踪该函数是否被调用(记为场景1),则:
1)根据步骤S1,探测方式为跟踪函数入口地址、函数名为fun;信息输出属性为打印触发信息,记为Ptrigger;其余无需设置。
2)根据步骤S2,由于探测方式为跟踪函数入口地址,因此无需分析汇编代码,偏移地址列表仅有一个为0的偏移地址数据。
3)根据步骤S3,通过偏移地址列表中的偏移地址(数据为0)、函数名fun及信息输出属性Ptrigger生成代码字符串数据“pr_info("enter fun \n”); ” 记为Context_Out,其余代码字符串数据为空,得到对应的代码数据集。
4)根据步骤S4,由于代码数据集的探测方式为跟踪函数入口地址,且代码数据集中许多代码字符串数据为空,仅需调用kprobe模板,替换kprobe模板中的输出信息部分为Context_Out;替换kprobe模板Makefile文件中的{}为fun,生成fun.c源码文件,最后编译。用户加载文件进行测试。
假设用户需要了解该函数入参数据的信息(记为场景2),则:
1)根据步骤S1,探测方式为跟踪函数入口地址、函数名为fun;信息输出属性为打印入参数据,记为Pargsr;其余无需设置。
2)根据步骤S2,由于探测方式为跟踪函数入口地址,因此无需分析汇编代码,偏移地址列表仅有一个为0的偏移地址数据。
3)根据步骤S3和图4,解析得到Pargs的信息如:{arg0->member1,int} ,其中arg0指函数的第一个入参,member1为入参ptr的成员;根据fun分析源码添加头文件数据到代码数据集中;根据{arg0->member1,int} 以ARM64为例转换成对应C代码字符串数据Context_Out,如:
pr_info("enter fun arg0 member1 is %d\n”,member1);
将上述的代码字符串数据存入代码数据集中;
4)根据步骤S4和图5,由于代码数据集的探测方式为跟踪函数入口地址,且代码数据集中许多代码字符串数据为空,仅需调用kprobe模板,替换kprobe模板中的输出信息为Context_Out,添加代码数据集中的头文件信息;替换kprobe模板Makefile文件中的{}为fun,生成fun.c源码文件,最后编译。用户加载文件仅需测试。
进一步的用户需要了解该函数返回值信息(记为场景3),则基本与场景1相同,仅信息输出属性为打印返回值、输出信息替换不同、模板选择为kretprobe。
进一步的用户需要跟踪该函数中子函数跳转点(记为场景5),则:
1)根据步骤S1,探测方式为跟踪子函数跳转点、函数名为fun;信息输出属性为打印触发信息Ptrigger
2)根据步骤S2,由于探测方式为跟踪子函数跳转点,遍历内核镜像或函数对应模块文件反编译生成的汇编代码,从中提取函数名对应的汇编代码,分析提取的汇编代码,寻找代码中子函数调用的指令,计算每个指令地址与函数入口地址的差值填入偏移地址列表中,同时生成子函数名与地址的信息映射表。
3)根据步骤S3、步骤S4和图2、图4、图5,对每个偏移地址生成对应模块文件,并编译,方法与场景1类似。
进一步的用户需要跟踪该函数的函数返回点(记为场景6)和源码位置运行点(记为场景7)则与场景5类似,仅提取的偏移地址列表add_list方法不同,不做进一步说明。
进一步的用户想修改函数的入参(记为场景8),则:
1)根据步骤S1,探测方式为跟踪函数入口地址、函数名为fun;指针数据修改属性为修改入参数据,记为Eargsr;其余无需设置。
2)根据步骤S2,由于探测方式为跟踪函数入口地址,因此无需分析汇编代码,偏移地址列表仅有一个为0的偏移地址数据。
3)根据步骤S3和图4,解析得到Eargs的信息如:{arg0->member1,int,10} ,其中arg0指函数的第一个入参,member1为入参指针指向的成员;根据fun分析源码添加头文件数据到代码数据集中;根据{arg0->member1,int,10} 以ARM64为例转换成对于C代码Context_Edit如:
sample_1->member1=10;
将上述的代码字符串数据存入代码数据集中;
4)根据步骤S4和图5,由于代码数据集的探测方式为跟踪函数入口地址,且代码数据集中许多替换步骤的数据为空,仅需调用kprobe模板,替换kprobe模板中的修改信息为Context_Edit,添加代码数据集中的头文件信息;替换kprobe模板Makefile文件中的{}为fun,生成fun.c源码文件,最后编译。用户加载文件测试。
进一步的用户想跟踪该函数在CPU0上是否被调用(记为场景8),则与场景1类似,相比场景1仅需增加替换模板中的过滤信息字段的步骤。结合图3,该项操作具体为:
1)在配置项中输入过滤方法,并根据步骤3提取数据,如{cpu,0},然后解析为C代码字符串Context_Edit:
int cpu = get_cpu();
put_cpu();
if (cpu !=0)
return 0;
2)根据步骤4替换模板中的过滤信息为Context_Edit,同时分析相关调用,添加头文件数据到代码数据集中,然后替换模板中的头文件信息。
进一步的,用户想跟踪该函数在指定入参情况下上是否被调用(记为场景9),则与场景8类似,仅需修改替换模板中的过滤信息字段的步骤。该项操作具体为:
1)在配置项中输入过滤方法,并根据步骤3提取数据,如(arg1,int,1),然后解析为C代码字符串到的Context_Edit:
int type=(struct int )regs->regs[1];
if (type !=1)
return 0;
2)替换模板中的过滤信息为Context_Edit,同时根据函数名fun分析源码信息映射表,生成头文件数据并添加到代码数据集中。
其它场景可以是场景1-9的组合或扩展,在此不再详细叙述。
实施例二
本实施例提出一种基于kprobe的linux内核动态调试系统,包括互相连接的微处理器和存储介质,所述微处理器被编程或配置以执行实施例一所述的基于kprobe的linux内核动态调试方法。
本实施例还提出一种计算机可读存储介质,所述计算机可读存储介质存储有被编程或配置以执行实施例一所述的基于kprobe的linux内核动态调试方法的计算机程序。
综上所述,本发明有益效果如下:
1)显著的提升了开发效率,用户无需繁琐的模块开发,即可监控插桩点有条件或无条件的触发探测、参数值、全局变量的信息输出,以及入参指针指向数据的修改。
2)降低了使用门槛,自动分析函数内部常用的插桩探测点,方便在函数内部插桩探测且无需人工分析汇编代码;同时也无需了解kprobe/kretprobe模块开发知识。
上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。

Claims (10)

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)获取过滤方法数据和当前偏移地址,解析过滤方法中的全局过滤属性,并转换成相应的C代码字符串数据;
S322)如果当前偏移地址为0,解析过滤方法中的入参过滤属性,并转换成相应的C代码字符串数据。
6.根据权利要求4所述的基于kprobe的linux内核动态调试方法,其特征在于,步骤S33中解析所述配置项中的信息输出属性和指针数据修改属性,转换成对应C代码字符串时,包括以下步骤:
S331)获取信息输出属性、指针数据修改属性、标识符和当前偏移地址,解析信息输出属性中的全局输出属性,获取输出方式,将所述全局输出属性和标识符根据所述输出方式进行c代码字符串转换,得到对应的C代码字符串数据和头文件数据;
S332)如果当前偏移地址为0,则解析信息输出属性中的入参输出属性,并结合标识符根据所述输出方式进行c代码字符串转换,得到对应的C代码字符串数据和头文件数据;
然后解析指针数据修改属性目中的入参修改属性并进行c代码字符串转换,得到对应的C代码字符串数据。
7.根据权利要求1所述的基于kprobe的linux内核动态调试方法,其特征在于,步骤S4中,根据所述探测方式调用指定的模板时,包括:若所述探测方式为跟踪函数返回值,则调用kretprobe模板,否则调用kprobe模板。
8.根据权利要求1所述的基于kprobe的linux内核动态调试方法,其特征在于,将代码数据集中的代码字符串数据导入所调用的模板中替换对应的原始数据时,包括:
增加模板中头文件信息为代码数据集中的头文件数据;
替换模板中的挂载函数为代码数据集中的函数名;
替换模板中的挂载函数的偏移地址点为代码数据集中的偏移地址;
替换模板中的过滤信息部分为代码数据集中过滤方法对应的C代码字符串;
替换模板中的输出信息部分为代码数据集中信息输出属性对应的C代码字符串;
替换模板中的修改信息部分为代码数据集中入参修改属性对应的C代码字符串;
替换模板Makefile文件中文件名相关数据为代码数据集中的标识符;
输出为文件名为标识符的.c文件,和对应的Makerfile文件;
如果为trace输出,则根据代码数据集中trace头文件数据,生成trace头文件,并将需要包含的头文件信息写入模板中。
9.一种基于kprobe的linux内核动态调试系统,其特征在于,包括互相连接的微处理器和存储介质,所述微处理器被编程或配置以执行权利要求1~8任一所述的基于kprobe的linux内核动态调试方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有被编程或配置以执行权利要求1~8任一所述的基于kprobe的linux内核动态调试方法的计算机程序。
CN202311345573.3A 2023-10-18 2023-10-18 基于kprobe的linux内核动态调试方法及系统 Active CN117076338B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311345573.3A CN117076338B (zh) 2023-10-18 2023-10-18 基于kprobe的linux内核动态调试方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311345573.3A CN117076338B (zh) 2023-10-18 2023-10-18 基于kprobe的linux内核动态调试方法及系统

Publications (2)

Publication Number Publication Date
CN117076338A true CN117076338A (zh) 2023-11-17
CN117076338B CN117076338B (zh) 2024-01-30

Family

ID=88706538

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311345573.3A Active CN117076338B (zh) 2023-10-18 2023-10-18 基于kprobe的linux内核动态调试方法及系统

Country Status (1)

Country Link
CN (1) CN117076338B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117312099A (zh) * 2023-11-28 2023-12-29 麒麟软件有限公司 文件系统事件监控方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130086558A1 (en) * 2011-09-29 2013-04-04 Microsoft Corporation Testing Program Code in Multiple Process Modes
CN104915292A (zh) * 2015-06-12 2015-09-16 浪潮电子信息产业股份有限公司 一种linux内核模块动态打桩的方法
CN112905472A (zh) * 2021-03-04 2021-06-04 黑芝麻智能科技(上海)有限公司 内核调试系统及方法
CN115017058A (zh) * 2022-08-04 2022-09-06 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20130086558A1 (en) * 2011-09-29 2013-04-04 Microsoft Corporation Testing Program Code in Multiple Process Modes
CN104915292A (zh) * 2015-06-12 2015-09-16 浪潮电子信息产业股份有限公司 一种linux内核模块动态打桩的方法
CN112905472A (zh) * 2021-03-04 2021-06-04 黑芝麻智能科技(上海)有限公司 内核调试系统及方法
CN115017058A (zh) * 2022-08-04 2022-09-06 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
KAIWAN N BILLIMORIA: "Linux Kernel Debugging: Leverage proven tools and advanced techniques to effectively debug Linux kernels and kernel modules", 《IEEE》 *
张萌;柏桂枝;: "内核态与用户态混合调试代理技术研究", 指挥控制与仿真, no. 01 *
李清干,邵作之: "Linux内核调试工具Kprobe机制的研究", 《中国电力教育》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117312099A (zh) * 2023-11-28 2023-12-29 麒麟软件有限公司 文件系统事件监控方法
CN117312099B (zh) * 2023-11-28 2024-04-05 麒麟软件有限公司 文件系统事件监控方法

Also Published As

Publication number Publication date
CN117076338B (zh) 2024-01-30

Similar Documents

Publication Publication Date Title
US10621068B2 (en) Software code debugger for quick detection of error root causes
CN110427331B (zh) 基于接口测试工具自动生成性能测试脚本的方法
US8387021B2 (en) Symbolic runtime checking of quantified contracts
US9747190B2 (en) Analysis system, analysis method, and computer program product
US8387016B2 (en) Whitebox trace fuzzing
US20110271258A1 (en) Software Development Tool
US20110271250A1 (en) Software Development Tool
US20110214108A1 (en) Architecture, system and method for generating visualizations from running executable code
CN117076338B (zh) 基于kprobe的linux内核动态调试方法及系统
US20120110560A1 (en) Data type provider for a web semantic store
US20110289486A1 (en) System and Method for Debugging Dynamically Generated Code of an Application
US11126527B2 (en) Software engineering method including tracing and visualizing
CN108469955B (zh) 一种基于注解的Android注入框架实现方法
CN111459495A (zh) 单元测试代码文件生成方法、电子装置及存储介质
JP6440895B2 (ja) ソフトウェア分析装置及びソフトウェア分析方法
US8776010B2 (en) Data type provider for a data store
CN112395184A (zh) 一种信息获取方法、设备和计算机存储介质
US7409677B1 (en) Method and system for creation and use of embedded trace description
Mahmud et al. Api change impact analysis for android apps
CN111260336A (zh) 基于规则引擎的业务核对方法、装置及设备
CN110928760B (zh) 一种嵌入式系统中的单元测试方法与装置
US20100281240A1 (en) Program Code Simulator
Di Lucca et al. Integrating static and dynamic analysis to improve the comprehension of existing web applications
Sulír et al. Generating method documentation using concrete values from executions
Barton et al. Dynamic and graphical web page breakpoints

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant