CN116627850A - 函数调试方法、装置、存储介质以及电子设备 - Google Patents
函数调试方法、装置、存储介质以及电子设备 Download PDFInfo
- Publication number
- CN116627850A CN116627850A CN202310907913.0A CN202310907913A CN116627850A CN 116627850 A CN116627850 A CN 116627850A CN 202310907913 A CN202310907913 A CN 202310907913A CN 116627850 A CN116627850 A CN 116627850A
- Authority
- CN
- China
- Prior art keywords
- function
- tracked
- ebpf
- tracking program
- program
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 64
- 238000003860 storage Methods 0.000 title claims abstract description 12
- 230000006870 function Effects 0.000 claims abstract description 325
- 238000012360 testing method Methods 0.000 claims description 61
- 238000004590 computer program Methods 0.000 claims description 15
- 230000007246 mechanism Effects 0.000 claims description 14
- 230000005540 biological transmission Effects 0.000 claims description 9
- 230000009191 jumping Effects 0.000 claims description 5
- 238000005516 engineering process Methods 0.000 abstract description 10
- 238000012545 processing Methods 0.000 description 12
- 238000004891 communication Methods 0.000 description 9
- 238000001514 detection method Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 6
- 238000012546 transfer Methods 0.000 description 5
- 230000006978 adaptation Effects 0.000 description 4
- 238000004519 manufacturing process Methods 0.000 description 3
- 230000008569 process Effects 0.000 description 3
- 230000001960 triggered effect Effects 0.000 description 3
- 238000007726 management method Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 239000000523 sample Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开涉及一种函数调试方法、装置、存储介质以及电子设备,涉及计算机技术领域,该方法在被追踪函数被调用的情况下,通过被追踪函数对应的eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至eBPF追踪程序对应的用户态追踪程序,其中eBPF追踪程序以及用户态追踪程序是根据被追踪函数生成的,其次通过用户态追踪程序将目标参数传递至测试函数,其中测试函数的参数与被追踪函数的参数一致,最后执行测试函数,以对被追踪函数进行调试。能够降低使用eBPF技术对Go语言应用程序进行动态追踪的难度,让Go语言开发者直接使用Go语言就能动态追踪程序中的函数调用参数。
Description
技术领域
本公开涉及计算机技术领域,具体地,涉及一种函数调试方法、装置、存储介质以及电子设备。
背景技术
随着用户规模以及服务器数量的增长,应用程序在生产环境中出现问题的概率也逐渐增大。而且,应用程序的大部分问题都是在线上运行时才产生,在线下测试时很难复现。在相关技术中,一般可以通过日志或者断线调试的方式来对应用程序进行调试。其中,日志收集到的信息往往不一定是线上出现的新问题所需要的,导致难以定位应用程序出现的新问题。而断线调试需要将发生问题的服务器下线,将流量导向其他服务器,然后对应用程序进行调试,但是这样会导致系统的整体吞吐量降低,导致应用程序出现的问题不同复现。因此,亟需提出一种适用于生产环境的调试方法。
发明内容
为克服相关技术中存在的问题,本公开提供一种函数调试方法、装置、存储介质以及电子设备。
根据本公开实施例的第一方面,提供一种函数调试方法,包括:
在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序,其中所述eBPF追踪程序以及所述用户态追踪程序是根据所述被追踪函数生成的;
通过所述用户态追踪程序将所述目标参数传递至测试函数,其中所述测试函数的参数与所述被追踪函数的参数一致;
执行所述测试函数,以对所述被追踪函数进行调试。
在一些实施例中,所述eBPF追踪程序以及所述用户态追踪程序通过以下步骤获得:
确定所述目标参数对应的参数类型;
根据所述参数类型,确定所述目标参数对应的参数偏移量;
确定所述目标参数对应的偏移位置;
根据所述目标参数对应的所述参数偏移量和所述偏移位置,结合预先配置的eBPF程序模板,生成所述eBPF追踪程序;
根据所述eBPF追踪程序生成对应的所述用户态追踪程序。
在一些实施例中,所述确定所述目标参数对应的参数类型,包括:
确定所述被追踪函数对应的调试信息;
根据所述调试信息,结合程序语言的反射机制,确定所述被追踪函数对应的所述参数类型。
在一些实施例中,所述通过所述用户态追踪程序将所述目标参数传递至测试函数,包括:
通过所述用户态追踪程序,根据所述被追踪函数对应的参数类型,将二进制的所述目标参数转换为结构化数据;
通过所述用户态追踪程序,将所述结构化数据转换为输入所述测试函数的参数值,并将所述参数值传递至所述测试函数。
在一些实施例中,在所述在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序之前,所述方法还包括:
确定所述被追踪函数对应的地址信息;
根据所述地址信息,加载所述eBPF追踪程序;
启动所述用户态追踪程序。
在一些实施例中,所述确定所述被追踪函数对应的地址信息,包括:
确定所述被追踪函数所在的程序对应的路径信息;
确定所述被追踪函数对应的函数名;
根据所述路径信息和所述函数名,确定所述被追踪函数对应的调试信息;
根据所述调试信息,确定所述地址信息。
在一些实施例中,所述在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序,包括:
根据所述被追踪函数对应的地址信息,在所述被追踪函数的预设位置插入跳转指令;
在所述被追踪函数被调用的情况下,触发软中断任务,并执行所述跳转指令,跳转执行所述eBPF追踪程序;
在所述软中断任务中,通过所述eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述用户态追踪程序。
根据本公开实施例的第二方面,提供一种函数调试装置,包括:
第一传输模块,配置为在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序,其中所述eBPF追踪程序以及所述用户态追踪程序是根据所述被追踪函数生成的;
第二传输模块,配置为通过所述用户态追踪程序将所述目标参数传递至测试函数,其中所述测试函数的参数与所述被追踪函数的参数一致;
调试模块,配置为执行所述测试函数,以对所述被追踪函数进行调试。
根据本公开实施例的第三方面,提供一种计算机可读存储介质,其上存储有计算机程序指令,该程序指令被处理器执行时实现本公开第一方面所提供的函数调试方法的步骤。
根据本公开实施例的第四方面,提供一种电子设备,包括:
存储器,其上存储有计算机程序;
处理器,用于执行所述存储器中的所述计算机程序,以实现本公开第一方面所提供的函数调试方法的步骤。
本公开的实施例提供的技术方案可以包括以下有益效果:通过被追踪函数对应的eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至eBPF追踪程序对应的用户态追踪程序,其中eBPF追踪程序以及用户态追踪程序是根据被追踪函数生成的,并通过用户态追踪程序将目标参数传递至测试函数,其中测试函数的参数与被追踪函数的参数一致,最终执行测试函数,以对被追踪函数进行调试。可以降低使用eBPF技术对Go语言应用程序进行动态追踪的难度,让Go语言开发者直接使用Go语言就能动态追踪程序中的函数调用参数。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
附图是用来提供对本公开的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本公开,但并不构成对本公开的限制。在附图中:
图1是根据一示例性实施例示出的一种函数调试方法的流程图;
图2是根据一示例性实施例示出的获得eBPF追踪程序以及用户态追踪程序的流程图;
图3是根据一示例性实施例示出的一种函数调试方法的示意图;
图4是根据一示例性实施例示出的一种函数调试装置的框图;
图5是根据一示例性实施例示出的一种电子设备的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的和本公开的一些方面相一致的装置和方法的例子。
图1是根据一示例性实施例示出的一种函数调试方法的流程图,如图1所示,本公开实施例提供一种函数调试方法,该函数调试方法可以由电子设备执行,该函数调试方法包括以下步骤。
在步骤110中,在被追踪函数被调用的情况下,通过被追踪函数对应的eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至eBPF追踪程序对应的用户态追踪程序,其中eBPF追踪程序以及用户态追踪程序是根据被追踪函数生成的。
这里,被追踪函数是指应用程序中需要进行调试的函数。例如,当在线上服务器运行的应用程序出现问题时,则该应用程序可以是被追踪函数。当然,被追踪函数也可以是预先设定好的应用程序中需要进行调试的函数。
在本公开实施例中,被追踪函数可以是由Go(又称Golang,是一种静态强类型和编译型语言)语言编写的,被追踪函数对应的应用程序可以是通过Go语言编写的应用程序。
eBPF是一种内核扩展技术,它允许开发人员无需开发内核代码,而使用一种简单的方式来将自定义的代码插入到内核的运行逻辑中。eBPF技术的原理是通过常驻在操作系统内核中的虚拟机,通过事件或插桩点触发执行对应eBPF追踪程序,并向eBPF追踪程序提供操作系统内核数据及用户态追踪程序堆栈或寄存器等数据。通过eBPF追踪程序,可以追踪任何运行在Linux(全称GNU/Linux,是一种类UNIX操作系统)系统上的用户态追踪程序。
因此,通过运行在操作系统内核的虚拟机中的eBPF追踪程序,可以获取到传入被追踪函数的目标参数。其中,传入被追踪函数的目标参数是指在生产环境中传入该被追踪函数的参数。例如,当在线上服务器部署的被追踪函数被调用时,会向该被追踪函数传入参数,被追踪函数基于传入的参数获得计算结果。因此,传入该被追踪函数的参数为目标参数。
eBPF追踪程序获取到传入被追踪函数的目标参数之后,将目标参数传递至eBPF追踪程序对应的用户态追踪程序,以通过用户态追踪程序将目标参数发送至测试函数。其中,由于eBPF追踪程序运行在系统内核中,eBPF追踪程序无法直接将目标参数传递至测试函数,运行在用户态(应用程序)下的用户态追踪程序则可以用于将目标参数传递至测试函数。
值得说明的是,本公开实施例涉及的eBPF追踪程序以及用户态追踪程序均是根据被追踪函数自动生成的,关于如何生成被追踪函数对应的eBPF追踪程序以及用户态追踪程序将在后续实施例中进行详细说明。
在步骤120中,通过用户态追踪程序将目标参数传递至测试函数,其中测试函数的参数与被追踪函数的参数一致。
这里,测试函数的参数与被追踪函数的参数保持一致,是为了在测试函数中实现对追踪函数的参数值的自定义处理,如何自定义处理取决于用户的实际需求。用户态追踪程序将接收到的目标参数传递至测试函数,测试函数则以该目标参数作为传入测试函数的参数。
在步骤130中,执行测试函数,以对被追踪函数进行调试。
这里,测试函数以该目标参数作为传入测试函数的参数,当执行测试函数时,测试函数能够模拟被追踪函数的运行情况,从而对测试函数进行调试即可实现在不下线被追踪函数的情况下,对被追踪函数进行调试。
由此,通过被追踪函数对应的eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至eBPF追踪程序对应的用户态追踪程序,其中eBPF追踪程序以及用户态追踪程序是根据被追踪函数生成的,并通过用户态追踪程序将目标参数传递至测试函数,其中测试函数的参数与被追踪函数的参数一致,最终执行测试函数,以对被追踪函数进行调试,可以在被追踪函数不断线的情况下,通过被追踪函数对应的测试函数对被追踪函数进行调试,从而实现在真实的生产环境下对被追踪函数进行调试,使得被追踪函数的调试更加准确。另外,eBPF追踪程序以及用户态追踪程序是根据被追踪函数而自动生成的,基于此,无需开发者手动编写eBPF追踪程序以及用户态追踪程序,降低了对被追踪函数进行调试的门槛,极大提高了调试效率。
图2是根据一示例性实施例示出的获得eBPF追踪程序以及用户态追踪程序的流程图。如图2所示,在一些实施例中,eBPF追踪程序以及用户态追踪程序可以通过以下步骤获得:
在步骤111中,确定目标参数对应的参数类型。
这里,参数类型决定了目标参数在内存中所占用的存储单元的个数。该参数类型可以是字符串、int、float、数组或Go语言特有的动态数组等其他的Go语言基础结构。不同的参数类型在内存中所占用的空间大小可能是不同的,例如,int类型的目标参数通常占用4个存储单元,float类型的目标参数通常占用4个存储单元或8个存储单元,等等。
在一些可以实现的实施方式中,可以确定被追踪函数对应的调试信息,并根据调试信息,结合程序语言的反射机制,确定被追踪函数对应的参数类型。
这里,调试信息可以是ELF格式的二进制调试信息,其包含了关于被追踪函数的代码的二进制形式的信息。示例性地,可以通过获取被追踪函数所在的应用程序对应的路径信息,并通过该路径信息找到被追踪函数对应的调试信息。
程序语言的反射机制是应用程序可以检查自身结构的能力,在应用程序运行时可以检查类型、变量和函数等信息。在本公开实施例中,程序语言的反射机制可以是指Go语言的反射机制,当然,针对使用不同编程语言编写的应用程序,程序语言的反射机制也可以是对应的编程语言对应的反射机制。
在步骤112中,根据参数类型,确定目标参数对应的参数偏移量。
这里,参数偏移量指在汇编语言中相对于栈或寄存器的偏移量。参数偏移量用于确定在函数内部如何访问函数参数的存储位置。参数偏移量与参数类型相对应,同一类的参数类型,其对应的参数偏移量可以是一致。参数偏移量是相对于函数的栈帧或其他存储区域进行计算的。当函数被调用时,参数会被推入栈中或存储在寄存器中。根据参数类型的大小和调用约定,可以计算出不同的参数类型对应的目标参数相对于栈顶或基地址的参数偏移量。
在步骤113中,确定目标参数对应的偏移位置。
这里,偏移位置指的是目标参数相对于某个参考点的内存地址偏移量。该偏移位置用于确定目标参数在内存中的位置,该偏移位置可以是通过目标参数相对于某个基地址或基准点计算得到的。并且可以依据Go语言编译器对被追踪函数的调用约定处理,确认调用该函数时的传参的偏移位置。
在步骤114中,根据目标参数对应的参数偏移量和偏移位置,结合预先配置的eBPF程序模板,生成eBPF追踪程序。
这里,预先配置的eBPF程序模板可以是指eBPF程序的通用形式,比如预先配置好eBPF程序的输入输出语句、判断语句和调用语句等通用语句。在预先配置的eBPF程序模板中,只缺少具体的参数,因为随着被追踪函数的不同,被追踪函数对应的目标参数不同,其对应的参数偏移量和偏移位置不同。因此,可以将参数偏移量和偏移位置,写入预先配置的eBPF程序模板中,生成eBPF追踪程序。
在目标参数的数量为多个的情况下,针对每一个目标参数,可以根据所属参数类型对应的eBPF程序模板,都动态生成一对应的eBPF追踪子程序,然后不断把新生成的eBPF追踪子程序合并到已生成的eBPF追踪子程序中,直到被追踪函数的全部参数都已生成对应的eBPF追踪子程序,得到被追踪函数对应的eBPF追踪程序。
在步骤115中,根据eBPF追踪程序生成对应的用户态追踪程序。
这里,可以根据Go语言,导入用于与内核进行交互的工具包,其次根据eBPF追踪程序传递的参数,定义相应的数据结构,并通过合适的数据结构来表示参数的内容,然后生成与eBPF追踪程序进行参数传递的语句,以及与测试函数进行参数传递的语句,从而获得用户态追踪程序。
由此,通过上述步骤111至步骤115,可以自动生成被追踪函数对应的eBPF追踪程序,无需用户手动编写eBPF追踪程序。降低使用eBPF技术对Go语言应用程序进行动态追踪的难度,使得Go语言开发者可以直接使用Go语言就能动态追踪被追踪函数的目标参数。
在一些实施例中,可以通过用户态追踪程序,根据被追踪函数对应的参数类型,将二进制的目标参数转换为结构化数据,并通过用户态追踪程序,将结构化数据转换为输入测试函数的参数值,并将参数值传递至测试函数。
这里,二进制的目标参数,是eBPF追踪程序从内核中获取到的被追踪函数对应的目标参数的二进制形式。但由于Go语言的应用程序无法识别二进制形式的数据,所以需要将二进制数据转化为相应的结构化数据,并将结构化的数据转化为Go语言的应用程序能够识别的参数值。所以用户态追踪程序不仅要向调试函数传递目标参数,也要对目标参数进行转换。
电子设备通过用户态追踪程序,根据被追踪函数对应的参数类型,将二进制的目标参数转换为结构化数据。其中,关于如何确定被追踪函数对应的参数类型可以参照上述实施例的相关描述,在此不再赘述。通过用户态追踪程序,结合Go语言的反射机制,将结构化数据转化为Go语言的应用程序能够识别的参数值,然后,可以通过用户态追踪程序,按照参数类型和目标参数之间的顺序,将参数值一一传递给测试函数。
由此,通过用户态追踪程序,根据被追踪函数对应的参数类型,将二进制的目标参数转换为结构化数据,并通过用户态追踪程序,将结构化数据转换为输入测试函数的参数值,并将参数值传递至测试函数。可以自动将内核中获取的数据,传输到用户态,并转化为Go语言可用的数据,无需用户手动编写用户态追踪程序以实现数据的传输与转换,降低对Go语言的应用程序进行动态追踪的难度,使得Go语言开发者可以直接使用Go语言就能动态追踪被追踪函数的目标参数。
在一些实施例中,在步骤110之前,还可以包括以下步骤:确定被追踪函数对应的地址信息,并根据地址信息加载eBPF追踪程序,然后启动用户态追踪程序。
这里,被追踪函数对应的地址信息可以是指被追踪函数对应的内存地址。
在一些可以实现的实施方式中,可以确定被追踪函数所在的程序对应的路径信息,以及被追踪函数对应的函数名,并根据路径信息和函数名,确定被追踪函数对应的调试信息,再根据调试信息,确定地址信息。
这里,路径信息指的是被追踪函数所在的程序对应的系统目录路径。通过路径信息可以查找到被追踪函数所在程序对应的文件,该文件中包含着ELF格式的二进制调试信息。被追踪函数对应的函数名是汇编语言形式的,则可以通过Go语言的反射机制,得到汇编形式的函数名。
应当理解的是,通过函数名在二进制调试信息中进行按名查找,可以确定被追踪函数对应的调试信息。从调试信息中可以查找到被追踪函数对应的内存地址。
在一些可以实现的实施方式中,可以根据被追踪函数对应的地址信息,通过LinuxUprobe机制将eBPF追踪程序加载到内核,为后续运行eBPF追踪程序做准备。
这里,Linux Uprobe机制是Linux内核提供的一个功能,用于在用户程序中插入并追踪函数调用或指令执行的事件。可以动态地在用户空间程序的被追踪函数中插入探测点,并能够捕获到被追踪函数的进入点、返回点以及任意指定的中间点的事件。这使得开发人员可以在不修改目标代码的情况下,获取函数调用的信息,进行性能分析、调试或运行时监测等操作。
应当理解的是,eBPF追踪程序是在内核中执行的,而不是在用户态程序中运行。通过加载到内核中,eBPF追踪程序可以直接访问内核的数据结构、函数和网络协议栈等底层资源,从而可以获取被追踪函数的目标参数的相关信息。其中,将eBPF追踪程序加载到内核,是指先将eBPF追踪程序加载到操作系统内核中,等待eBPF追踪程序后续的执行或数据的访问。
应当理解的是,启动用户态追踪程序,是与加载eBPF追踪程序相互独立的。启动用户态追踪程序,是为了等待接收eBPF追踪程序后续执行时获取到的目标参数。
由此,通过确定被追踪函数对应的地址信息,并根据地址信息,加载eBPF追踪程序,再启动用户态追踪程序,可以自动加载eBPF追踪程序并启动用户态追踪程序,为获取内核中的数据,传输到用户态,并转化为Go语言可用的数据做必要的准备。降低了对Go语言应用程序进行动态追踪的难度,使得Go语言开发者可以直接使用Go语言就能动态追踪被追踪函数的目标参数。
在一种可能的实施方式,步骤110可以包括以下步骤:根据被追踪函数对应的地址信息,在被追踪函数的预设位置插入跳转指令;在被追踪函数被调用的情况下,触发软中断任务,并执行跳转指令,跳转执行eBPF追踪程序;在软中断任务中,通过eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至用户态追踪程序。
这里,预设位置可以是指被追踪函数对应的程序中被追踪函数所在的位置。该预设位置可以是通过被追踪函数的函数名在ELF格式的二进制调试信息中按名查找得到的。在预设位置插入跳转指令后,当用户程序调用被追踪函数时,触发软中断任务。当完成软中断任务后,并获取到被追踪函数的目标参数后,再执行被追踪函数,不会影响被追踪函数的线上运行。
应当理解的是,当用户程序调用被追踪函数时,是通过Linux Uprobe机制来触发软中断任务的,进入到内核,执行eBPF追踪程序。eBPF追踪程序从内核中的数据结构和函数等信息中,获取到被追踪函数的目标参数。
由此,通过根据被追踪函数对应的地址信息,在被追踪函数的预设位置插入跳转指令,在被追踪函数被调用的情况下,触发软中断任务,执行跳转指令,跳转执行eBPF追踪程序,并在软中断任务中,通过eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至用户态追踪程序,可以自动进行对被追踪函数的定位和追踪。降低了对Go语言应用程序进行动态追踪的难度,使得Go语言开发者可以直接使用Go语言就能动态追踪被追踪函数的目标参数。
图3是根据一示例性实施例示出的一种函数调试方法的示意图,如图3所示,一种可实施的示例如下。
上述函数调试方法可以封装为一个Go语言程序动态追踪工具包,帮助用户自动追踪被追踪函数。该Go语言程序动态追踪工具包包含路径设置函数和用户函数探测函数。用户只需编写追踪程序,在追踪程序中编写该工具包提供的路径设置函数和用户函数探测函数的调用语句。该调用语句需要配置关于被追踪函数的参数:将路径设置函数的参数,设置为被追踪函数对应的应用程序的路径;将用户函数探测函数的第一参数,设置为被追踪函数对应的Go语言程序中的函数名,将用户函数探测函数的第二参数,设置为测试函数。
这里,测试函数是用户用于调试被追踪函数的函数,测试函数中包含用于处理对被追踪函数实时调用时对应的参数值的代码,这些代码是用户自定义的,取决于用户想要获得什么样的信息。测试函数,在动态追踪的过程中,是以回调函数的形式,作为用户函数探测函数的第二参数。所以在设置测试函数时,可以保持测试函数的参数与用户函数探测函数的参数一致。
当用户编写好追踪程序后并启动时,通过追踪程序,自动进行以下过程:
通过用户函数探测函数,根据用户传入的第一参数和第二参数,进行分析函数的处理,确定被追踪函数的函数信息。根据函数信息,生成被追踪函数对应的eBPF追踪程序,以及eBPF追踪程序对应的用户态追踪程序。并加载启动eBPF追踪程序和启动用户态追踪程序,直到追踪程序被调用,运行eBPF追踪程序和用户态追踪程序。
运行在web(World Wide Web,全球广域网)服务器上的用户程序,提供web服务,其他客户端向web服务器发起请求,运行在web服务器上的用户程序响应于该请求,启动web服务,调用被追踪函数。此时触发软中断,即跳转到内核执行eBPF追踪程序。通过eBPF追踪程序,动态获取被追踪函数的目标参数。通过用户态追踪程序,接收eBPF追踪程序获取到的目标参数,并将目标参数进行处理,并通过反射,调用测试函数将处理后的目标参数传递给测试函数,以便测试函数可以识别。通过测试函数,根据目标参数,对被追踪函数进行调试。
上述过程包含在Go语言程序动态追踪工具包,通过自动加载eBPF追踪程序并启动用户态追踪程序,降低使用eBPF技术对Go语言应用程序进行动态追踪的难度,让Go语言开发者直接使用Go语言就能动态追踪程序中的函数调用参数。
图4是根据一示例性实施例示出的一种函数调试装置的框图。参照图4,该函数调试装置包括:
第一传输模块401,配置为在被追踪函数被调用的情况下,通过被追踪函数对应的eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至eBPF追踪程序对应的用户态追踪程序,其中eBPF追踪程序以及用户态追踪程序是根据被追踪函数生成的;
第二传输模块402,配置为通过用户态追踪程序将目标参数传递至测试函数,其中测试函数的参数与被追踪函数的参数一致;
调试模块403,配置为执行测试函数,以对被追踪函数进行调试。
在一些实施例中,所述函数调试装置包括程序生成模块,所述程序生成模块配置为:
确定目标参数对应的参数类型;
根据参数类型,确定目标参数对应的参数偏移量;
确定目标参数对应的偏移位置;
根据目标参数对应的参数偏移量和偏移位置,结合预先配置的eBPF程序模板,生成eBPF追踪程序;
根据eBPF追踪程序生成对应的用户态追踪程序。
在一些实施例中,所述程序生成模块配置为:
确定被追踪函数对应的调试信息;
根据调试信息,结合程序语言的反射机制,确定被追踪函数对应的参数类型。
在一些实施例中,第二传输模块402配置为:
通过用户态追踪程序,根据被追踪函数对应的参数类型,将二进制的目标参数转换为结构化数据;
通过用户态追踪程序,将结构化数据转换为输入测试函数的参数值,并将参数值传递至测试函数。
在一些实施例中,所述函数调试装置还包括加载模块,配置为:
确定被追踪函数对应的地址信息;
根据地址信息,加载eBPF追踪程序;
启动用户态追踪程序。
在一些实施例中,所述加载模块,配置为:
确定被追踪函数所在的程序对应的路径信息;
确定被追踪函数对应的函数名;
根据路径信息和函数名,确定被追踪函数对应的调试信息;
根据调试信息,确定地址信息。
在一些实施例中,第一传输模块401配置为:
根据被追踪函数对应的地址信息,在被追踪函数的预设位置插入跳转指令;
在被追踪函数被调用的情况下,触发软中断任务,并执行跳转指令,跳转执行eBPF追踪程序;
在软中断任务中,通过eBPF追踪程序获取传入被追踪函数的目标参数,并将目标参数传递至用户态追踪程序。
关于上述实施例中的函数调试装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不作详细阐述说明。
本公开还提供一种计算机可读存储介质,其上存储有计算机程序指令,该程序指令被处理器执行时实现本公开提供的函数调试方法的步骤。
图5是根据一示例性实施例示出的一种电子设备的框图。例如,电子设备可以是嵌入式系统,微控制器,网络设备,电子测试设备等。
参照图5,电子设备500可以包括以下或多个组件:处理组件502,存储器504,电源组件506,输入/输出接口512,以及通信组件516。
处理组件502通常控制电子设备500的整体操作,诸如与显示,数据通信和记录操作相关联的操作。处理组件502可以包括一个或多个处理器520来执行指令,以完成上述任一函数调试方法的全部或部分步骤。此外,处理组件502可以包括一个或多个模块,便于处理组件502和其他组件之间的交互。
存储器504被配置为存储各种类型的数据以支持在电子设备500的操作。这些数据的示例包括用于在电子设备500上操作的任何应用程序或方法的指令。存储器504可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
电源组件506为电子设备500的各种组件提供电力。电源组件506可以包括电源管理系统,一个或多个电源,及其他与为电子设备500生成、管理和分配电力相关联的组件。
输入/输出接口512为处理组件502和外围接口模块之间提供接口。
通信组件516被配置为便于电子设备500和其他设备之间有线或无线方式的通信。电子设备500可以接入基于通信标准的无线网络,如WiFi,2G或3G,或它们的组合。在一个示例性实施例中,通信组件516经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件516还包括近场通信(NFC)模块,以促进短程通信。例如,在NFC模块可基于射频识别(RFID)技术,红外数据协会(IrDA)技术,超宽带(UWB)技术,蓝牙(BT)技术和其他技术来实现。
在示例性实施例中,电子设备500可以被一个或多个应用专用集成电路(ASIC)、数字信号处理器(DSP)、数字信号处理设备(DSPD)、可编程逻辑器件(PLD)、现场可编程门阵列(FPGA)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述任一函数调试方法。
在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器504,上述指令可由电子设备500的处理器520执行以完成上述函数调试方法。例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
在另一示例性实施例中,还提供一种计算机程序产品,该计算机程序产品包含能够由可编程的装置执行的计算机程序,该计算机程序具有当由该可编程的装置执行时用于执行上述任一函数调试方法的代码部分。
本领域技术人员在考虑说明书及实践本公开后,将容易想到本公开的其他实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
在另一示例性实施例中,还提供一种计算机程序产品,该计算机程序产品包含能够由可编程的装置执行的计算机程序,该计算机程序具有当由该可编程的装置执行时用于执行上述的函数调试方法的代码部分。
本领域技术人员在考虑说明书及实践本公开后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (10)
1.一种函数调试方法,其特征在于,包括:
在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序,其中所述eBPF追踪程序以及所述用户态追踪程序是根据所述被追踪函数生成的;
通过所述用户态追踪程序将所述目标参数传递至测试函数,其中所述测试函数的参数与所述被追踪函数的参数一致;
执行所述测试函数,以对所述被追踪函数进行调试。
2.根据权利要求1所述的方法,其特征在于,所述eBPF追踪程序以及所述用户态追踪程序通过以下步骤获得:
确定所述目标参数对应的参数类型;
根据所述参数类型,确定所述目标参数对应的参数偏移量;
确定所述目标参数对应的偏移位置;
根据所述目标参数对应的所述参数偏移量和所述偏移位置,结合预先配置的eBPF程序模板,生成所述eBPF追踪程序;
根据所述eBPF追踪程序生成对应的所述用户态追踪程序。
3.根据权利要求2所述的方法,其特征在于,所述确定所述目标参数对应的参数类型,包括:
确定所述被追踪函数对应的调试信息;
根据所述调试信息,结合程序语言的反射机制,确定所述被追踪函数对应的所述参数类型。
4.根据权利要求1所述的方法,其特征在于,所述通过所述用户态追踪程序将所述目标参数传递至测试函数,包括:
通过所述用户态追踪程序,根据所述被追踪函数对应的参数类型,将二进制的所述目标参数转换为结构化数据;
通过所述用户态追踪程序,将所述结构化数据转换为输入所述测试函数的参数值,并将所述参数值传递至所述测试函数。
5.根据权利要求1所述的方法,其特征在于,在所述在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序之前,所述方法还包括:
确定所述被追踪函数对应的地址信息;
根据所述地址信息,加载所述eBPF追踪程序;
启动所述用户态追踪程序。
6.根据权利要求5所述的方法,其特征在于,所述确定所述被追踪函数对应的地址信息,包括:
确定所述被追踪函数所在的程序对应的路径信息;
确定所述被追踪函数对应的函数名;
根据所述路径信息和所述函数名,确定所述被追踪函数对应的调试信息;
根据所述调试信息,确定所述地址信息。
7.根据权利要求1所述的方法,其特征在于,所述在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序,包括:
根据所述被追踪函数对应的地址信息,在所述被追踪函数的预设位置插入跳转指令;
在所述被追踪函数被调用的情况下,触发软中断任务,并执行所述跳转指令,跳转执行所述eBPF追踪程序;
在所述软中断任务中,通过所述eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述用户态追踪程序。
8.一种函数调试装置,其特征在于,所述装置包括:
第一传输模块,配置为在被追踪函数被调用的情况下,通过所述被追踪函数对应的eBPF追踪程序获取传入所述被追踪函数的目标参数,并将所述目标参数传递至所述eBPF追踪程序对应的用户态追踪程序,其中所述eBPF追踪程序以及所述用户态追踪程序是根据所述被追踪函数生成的;
第二传输模块,配置为通过所述用户态追踪程序将所述目标参数传递至测试函数,其中所述测试函数的参数与所述被追踪函数的参数一致;
调试模块,配置为执行所述测试函数,以对所述被追踪函数进行调试。
9.一种计算机可读存储介质,其上存储有计算机程序指令,其特征在于,该程序指令被处理器执行时实现权利要求1-7中任一项所述的函数调试方法的步骤。
10.一种电子设备,其特征在于,包括:
存储器,其上存储有计算机程序;
处理器,用于执行所述存储器中的所述计算机程序,以实现权利要求1-7中任一项所述的函数调试方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310907913.0A CN116627850B (zh) | 2023-07-21 | 2023-07-21 | 函数调试方法、装置、存储介质以及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310907913.0A CN116627850B (zh) | 2023-07-21 | 2023-07-21 | 函数调试方法、装置、存储介质以及电子设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116627850A true CN116627850A (zh) | 2023-08-22 |
CN116627850B CN116627850B (zh) | 2023-10-03 |
Family
ID=87592465
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310907913.0A Active CN116627850B (zh) | 2023-07-21 | 2023-07-21 | 函数调试方法、装置、存储介质以及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116627850B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117215901A (zh) * | 2023-11-09 | 2023-12-12 | 华南师范大学 | 基于动态追踪的编程练习评价方法、系统、设备及介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107943646A (zh) * | 2017-11-08 | 2018-04-20 | 北京云杉世纪网络科技有限公司 | 一种程序监控方法及装置 |
US20190324882A1 (en) * | 2018-04-20 | 2019-10-24 | Draios, Inc. | Programmatic container monitoring |
CN114860216A (zh) * | 2022-07-07 | 2022-08-05 | 麒麟软件有限公司 | 一种用于集成开发环境的c程序动态追踪方法及系统 |
WO2022193513A1 (zh) * | 2021-03-17 | 2022-09-22 | 腾讯云计算(北京)有限责任公司 | 一种基于容器引擎的数据处理方法以及相关设备 |
-
2023
- 2023-07-21 CN CN202310907913.0A patent/CN116627850B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107943646A (zh) * | 2017-11-08 | 2018-04-20 | 北京云杉世纪网络科技有限公司 | 一种程序监控方法及装置 |
US20190324882A1 (en) * | 2018-04-20 | 2019-10-24 | Draios, Inc. | Programmatic container monitoring |
WO2022193513A1 (zh) * | 2021-03-17 | 2022-09-22 | 腾讯云计算(北京)有限责任公司 | 一种基于容器引擎的数据处理方法以及相关设备 |
CN114860216A (zh) * | 2022-07-07 | 2022-08-05 | 麒麟软件有限公司 | 一种用于集成开发环境的c程序动态追踪方法及系统 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117215901A (zh) * | 2023-11-09 | 2023-12-12 | 华南师范大学 | 基于动态追踪的编程练习评价方法、系统、设备及介质 |
CN117215901B (zh) * | 2023-11-09 | 2024-03-08 | 华南师范大学 | 基于动态追踪的编程练习评价方法、系统、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116627850B (zh) | 2023-10-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105094783B (zh) | 安卓应用稳定性测试的方法及装置 | |
US10338907B2 (en) | Cloud service framework for toolkit deployment | |
US20110191752A1 (en) | Method and System for Debugging of Software on Target Devices | |
CN111124919A (zh) | 一种用户界面的测试方法、装置、设备及存储介质 | |
CN105338110A (zh) | 远程调试方法和平台、服务器 | |
CN107015841B (zh) | 一种程序编译的预处理方法及程序编译设备 | |
CN116627850B (zh) | 函数调试方法、装置、存储介质以及电子设备 | |
CN111176629A (zh) | 一种应用开发的方法和装置 | |
CN108614767A (zh) | 一种远程调试方法及装置 | |
CN112732576B (zh) | 基于用户界面的自动化测试方法、装置及设备 | |
US20080127061A1 (en) | Method and system for editing code | |
CN112231206A (zh) | 应用程序测试的脚本编辑方法、计算机可读存储介质及测试平台 | |
CN113127329B (zh) | 脚本调试方法、装置及计算机存储介质 | |
CN109542464B (zh) | IoT设备脚本程序的开发部署系统、方法及存储介质 | |
CN111258802A (zh) | 捕获应用程序崩溃信息的方法及相关设备 | |
CN114816672A (zh) | 虚拟机的创建方法、装置、电子设备和存储介质 | |
CN112988588B (zh) | 客户端软件调试方法、装置、存储介质及电子设备 | |
CN113709243A (zh) | 设备远程控制方法及装置、电子设备和存储介质 | |
KR101629578B1 (ko) | Rte 코드 생성 방법 및 이를 실행하는 장치 | |
JP2008135008A (ja) | プログラムモジュール検証方式 | |
CN112506782B (zh) | 一种应用程序的测试方法、装置、设备及存储介质 | |
CN109669715A (zh) | 应用程序动态更新方法、设备及存储介质 | |
CN113986263A (zh) | 代码自动化测试方法、装置、电子设备、存储介质 | |
CN115185570A (zh) | 基于jira系统的任务流处理方法、系统、设备、介质和计算机程序产品 | |
CN111427770B (zh) | 一种资源测试方法及相关设备 |
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 |