CN116010112B - 钩子函数的调用方法、装置、计算机设备及可读存储介质 - Google Patents
钩子函数的调用方法、装置、计算机设备及可读存储介质 Download PDFInfo
- Publication number
- CN116010112B CN116010112B CN202310301529.6A CN202310301529A CN116010112B CN 116010112 B CN116010112 B CN 116010112B CN 202310301529 A CN202310301529 A CN 202310301529A CN 116010112 B CN116010112 B CN 116010112B
- Authority
- CN
- China
- Prior art keywords
- interface
- called
- calling
- class
- resource
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 75
- 238000012545 processing Methods 0.000 claims abstract description 59
- 230000008569 process Effects 0.000 claims abstract description 30
- 238000004806 packaging method and process Methods 0.000 claims abstract description 29
- 230000006870 function Effects 0.000 claims description 93
- 230000004044 response Effects 0.000 claims description 11
- 238000004590 computer program Methods 0.000 claims description 8
- 230000006378 damage Effects 0.000 claims description 2
- 230000015556 catabolic process Effects 0.000 abstract description 6
- 230000002452 interceptive effect Effects 0.000 abstract description 2
- 238000011282 treatment Methods 0.000 abstract 1
- 238000012544 monitoring process Methods 0.000 description 6
- 238000004458 analytical method Methods 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 230000008859 change Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 230000000593 degrading effect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000009877 rendering Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Images
Classifications
-
- 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
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种钩子函数的调用方法、装置、计算机设备及可读存储介质,涉及互联网技术领域,使用包装类代替Mutex,基于包装类将用于与API交互的代码与钩子代码隔离,避免直接干扰钩子代码,也能够避免在钩子代码中进行大量处理,提升稳定性,解决易发生程序崩溃的问题,提高钩子函数的调用效率。所述方法包括:响应于接口调用指令,确定待调用接口;获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类;加载所述待调用资源类,执行所述待调用接口的调用操作;在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
Description
技术领域
本申请涉及互联网技术领域,特别是涉及一种钩子函数的调用方法、装置、计算机设备及可读存储介质。
背景技术
随着互联网技术的发展,各类应用程序层出不穷,应用程序在终端上运行时,需要调用各种应用接口实现其功能,比如在需要显示图显示,应用程序要调用图形API(Application Program Interface,应用程序接口),以便根据渲染指令对图像数据进行渲染处理,将渲染后的图像数据显示在终端的显示屏上。其中,Vulkan API是一种开放的、低级别的图形编程接口,用于管理多线程的3D(3 Dimensions,三维)图形和计算工作负载,它是一种跨平台的API,可以在多种操作系统和计算机硬件平台上运行。Vulkan Layer是Vulkan API的可选部分,可以在API调用的生命周期中插入,Vulkan Layer Hook钩子的功能是在Vulkan API调用时对其进行拦截,并对其进行修改或执行其他操作,以达到调试、监控、性能分析等目的。
相关技术中,在Vulkan Layer Hook中,多线程对共享资源的操作可能会导致数据不一致的问题,因此,需要使用Mutex(互斥锁)来解决这个问题,也即每个线程在对共享资源进行操作前,均尝试加锁,加锁成功才能操作,操作结束后解锁。但是申请人认识到,过多使用Mutex会影响性能,稳定性较差,容易发生程序崩溃等问题,导致Hook(钩子)函数的调用效率不高。
发明内容
有鉴于此,本申请提供了一种钩子函数的调用方法、装置、计算机设备及可读存储介质,主要目的在于解决目前过多使用Mutex会影响性能,稳定性较差,容易发生程序崩溃等问题,导致Hook函数的调用效率不高的问题。
依据本申请第一方面,提供了一种钩子函数的调用方法,该方法包括:
响应于接口调用指令,确定待调用接口;
获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类;
加载所述待调用资源类,执行所述待调用接口的调用操作;
在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
可选地,所述响应于所述待调用接口的接口调用指令,确定待调用接口之前,所述方法还包括:
在所述待调用接口中插入可配置层组件;
在所述可配置层组件中插入所述钩子函数,以及在所述可配置层组件中创建所述包装类。
可选地,所述响应于所述待调用接口的接口调用指令,确定待调用接口之后,所述方法还包括:
查询所述待调用接口是否存在历史调用记录;
若所述待调用接口存在所述历史调用记录,则读取系统内存,在所述系统内存缓存的数据中获取所述待调用资源类,以及加载所述待调用资源类,其中,所述待调用资源类是在所述待调用接口首次被调用时生成并缓存至所述系统内存的;
若所述待调用接口不存在所述历史调用记录,则执行获取所述待调用接口在被调用时依赖的接口资源,并基于包装类对所述接口资源进行处理得到待调用资源类的过程,其中,当成功生成所述待调用资源类时,将所述待调用资源类缓存至所述系统内存中。
可选地,所述获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类,包括:
查询所述待调用接口的接口调用代码,根据所述接口调用代码,获取所述接口资源;
采用所述包装类对所述接口资源进行处理,将所述接口资源的数据类型转换为类,得到所述待调用资源类。
可选地,所述根据所述接口调用代码,获取所述接口资源,包括:
按照所述接口调用代码的指示,查询所述待调用接口在被调用时的接口数据;
获取所述接口数据的句柄,将所述句柄作为所述接口资源。
可选地,所述方法还包括:
当同时接收到请求对所述待调用接口进行调用的多个调用指令时,获取所述待调用接口的所述待调用资源类;
采用多个并行线程同时加载所述待调用资源类,并行执行所述待调用接口的调用操作;
在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
可选地,所述方法还包括:
当检测到请求对一系统接口执行句柄销毁操作时,查询所述系统接口对应的待销毁资源类,其中,所述待销毁资源类是基于所述包装类对所述系统接口在被调用时依赖的接口资源进行处理得到的;
对所述待销毁资源类执行销毁操作。
依据本申请第二方面,提供了一种钩子函数的调用装置,该装置包括:
确定模块,用于响应于接口调用指令,确定待调用接口;
处理模块,用于获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类;
加载模块,用于加载所述待调用资源类,执行所述待调用接口的调用操作;
调用模块,用于在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
可选地,所述装置还包括:
插入模块,用于在所述待调用接口中插入可配置层组件;在所述可配置层组件中插入所述钩子函数,以及在所述可配置层组件中创建所述包装类。
可选地,所述装置还包括:
查询模块,用于查询所述待调用接口是否存在历史调用记录;
读取模块,用于若所述待调用接口存在所述历史调用记录,则读取系统内存,在所述系统内存缓存的数据中获取所述待调用资源类,以及加载所述待调用资源类,其中,所述待调用资源类是在所述待调用接口首次被调用时生成并缓存至所述系统内存的;
所述处理模块,还用于若所述待调用接口不存在所述历史调用记录,则执行获取所述待调用接口在被调用时依赖的接口资源,并基于包装类对所述接口资源进行处理得到待调用资源类的过程,其中,当成功生成所述待调用资源类时,将所述待调用资源类缓存至所述系统内存中。
可选地,所述处理模块,用于查询所述待调用接口的接口调用代码,根据所述接口调用代码,获取所述接口资源;采用所述包装类对所述接口资源进行处理,将所述接口资源的数据类型转换为类,得到所述待调用资源类。
可选地,所述处理模块,用于按照所述接口调用代码的指示,查询所述待调用接口在被调用时的接口数据;获取所述接口数据的句柄,将所述句柄作为所述接口资源。
可选地,所述加载模块,还用于当同时接收到请求对所述待调用接口进行调用的多个调用指令时,获取所述待调用接口的所述待调用资源类;采用多个并行线程同时加载所述待调用资源类,并行执行所述待调用接口的调用操作;
所述调用模块,还用于在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
可选地,所述装置还包括:
销毁模块,用于当检测到请求对一系统接口执行句柄销毁操作时,查询所述系统接口对应的待销毁资源类,其中,所述待销毁资源类是基于所述包装类对所述系统接口在被调用时依赖的接口资源进行处理得到的;对所述待销毁资源类执行销毁操作。
依据本申请第三方面,提供了一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述第一方面中任一项所述方法的步骤。
依据本申请第四方面,提供了一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面中任一项所述的方法的步骤。
借由上述技术方案,本申请提供的一种钩子函数的调用方法、装置、计算机设备及可读存储介质,本申请响应于接口调用指令,确定待调用接口,获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类,加载待调用资源类,执行待调用接口的调用操作,在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理,使用包装类代替Mutex,基于包装类将用于与API交互的代码与钩子代码隔离,避免直接干扰钩子代码,也能够避免在钩子代码中进行大量处理,提升稳定性,解决易发生程序崩溃的问题,提高钩子函数的调用效率。
上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本申请实施例提供的一种钩子函数的调用方法流程示意图;
图2示出了本申请实施例提供的另一种钩子函数的调用方法流程示意图;
图3示出了本申请实施例提供的一种钩子函数的调用装置的结构示意图;
图4示出了本申请实施例提供的一种计算机设备的装置结构示意图。
具体实施方式
下面将参照附图更详细地描述本申请的示例性实施例。虽然附图中显示了本申请的示例性实施例,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。
本申请实施例提供了一种钩子函数的调用方法,如图1所示,该方法包括:
101、响应于接口调用指令,确定待调用接口。
Vulkan API是一种开放的、低级别的图形编程接口,用于管理多线程的3D图形和计算工作负载,它是一种跨平台的API,可以在多种操作系统和计算机硬件平台上运行。Vulkan API的设计目的是提供一个高效,灵活和可扩展的图形编程接口,以支持更多的图形和计算场景,它的特点包括对多核CPU的支持,允许程序员更好地控制内存管理和图形资源,以及更低的 CPU (Central Processing Unit,中央处理器)开销。
Vulkan Layer是Vulkan API的可选部分,可以在API调用的生命周期中插入。这些Layer可以实现各种功能,如监视和调试,内存管理,报告错误和跟踪性能,它们可以作为一个独立的模块与Vulkan API集成,并可以在运行时加载和卸载。其中,Vulkan Layer Hook钩子的功能是在Vulkan API调用时对其进行拦截,并对其进行修改或执行其他操作,以达到调试、监控、性能分析等目的。Hook的工作原理是通过在Vulkan API函数调用前插入自定义代码,以实现对API函数的拦截。每个Hook钩子都是一个回调函数,在API函数被调用时被触发。在每个钩子回调函数内,可以执行多种操作,如检查输入参数的有效性、修改返回值、检查资源使用情况、记录API调用日志等。这些操作可以让开发人员更好地了解程序的运行状态,从而更好地解决问题、优化性能和实现其他功能。
申请人认识到,现有的Vulkan Layer Hook解决方案存在一些局限性,比如可能会降低应用程序的性能,因为它们会对每个API调用执行大量的额外操作,或可能只能捕获特定类型的API调用,并且不能方便地自定义捕获策略,或可能在运行时出现各种问题,例如程序崩溃、数据丢失等,或可能没有实现易于理解的报告功能,使得开发人员难以识别和解决问题等等。另外,在Vulkan Layer Hook中,多线程对共享资源的操作可能会导致数据不一致的问题,因此,需要使用Mutex来解决这个问题,也即每个线程在对共享资源进行操作前,均尝试加锁,加锁成功才能操作,操作结束后解锁,而使用过多的Mutex会影响性能稳定性较差,容易发生程序崩溃等问题,导致Hook函数的调用效率不高。因此,本申请提出了一种钩子函数的调用方法,使用包装类代替Mutex,基于包装类将用于与API交互的代码与钩子代码隔离,避免直接干扰钩子代码,也能够避免在钩子代码中进行大量处理,提升稳定性,解决易发生程序崩溃的问题,提高钩子函数的调用效率。
本申请实施例可以应用于Vulkan API所处系统,系统可以提供面向前端提供调用入口,当检测到用户触发调用入口时,确定用户请求调用系统的接口,也即确定接收到接口调用指令。而响应于接口调用指令,系统会查询用户对哪个系统接口请求调用,将用户请求调用的系统接口作为待调用接口,其中,待调用接口可以是系统中的任一系统接口,本申请对此不进行具体限定。
102、获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类。
在本申请实施例中,确定了待调用接口后,由于需要使用包装类代替Mutex,因此,系统会获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类。
其中,包装类可以是wrapper,wrapper是一个函数或类,可以让基本数据类型变成类,有了类的特点后,便能够调用类中的方法。进一步,接口资源可以是待调用接口被调用时所依赖的句柄,比如Handle(句柄),本申请对接口资源不进行具体限定。
103、加载待调用资源类,执行待调用接口的调用操作。
在本申请实施例中,当生成待调用资源类后,系统便可以通过加载待调用资源类,执行待调用接口的调用操作。
104、在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理。
在本申请实施例中,由于钩子的功能是在Vulkan API调用时对其进行拦截,并对其进行修改或执行其他操作,以达到调试、监控、性能分析等目的,因此,在检测到待调用接口被成功调用时,系统会调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理。其中,在在每个钩子函数内,可以执行多种操作,如检查输入参数的有效性、修改返回值、检查资源使用情况、记录API调用日志等,这些操作可以让开发人员更好地了解程序的运行状态,从而更好地解决问题、优化性能和实现其他功能。
本申请实施例提供的方法,响应于接口调用指令,确定待调用接口,获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类,加载待调用资源类,执行待调用接口的调用操作,在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理,使用包装类代替Mutex,基于包装类将用于与API交互的代码与钩子代码隔离,避免直接干扰钩子代码,也能够避免在钩子代码中进行大量处理,提升稳定性,解决易发生程序崩溃的问题,提高钩子函数的调用效率。
进一步的,作为上述实施例具体实施方式的细化和扩展,为了完整说明本实施例的具体实施过程,本申请实施例提供了另一种钩子函数的调用方法,如图2所示,该方法包括:
201、在待调用接口中插入可配置层组件,在可配置层组件中插入钩子函数,以及在可配置层组件中创建包装类。
本申请实施例可以应用于Vulkan API所处系统,在本申请实施例中,对于VulkanAPI来说,需要在Vulkan API调用的生命周期中插入Vulkan Layer,并在Vulkan Layer中实现Hook功能,这些Layer可以实现各种功能,如监视和调试,内存管理,报告错误和跟踪性,因此,需要事先在待调用接口中插入可配置层组件,插入可配置层组件也即Layer,接着,系统在可配置层组件中插入钩子函数,以及在可配置层组件中创建包装类,以便完成本申请实施例的技术方案。其中,钩子函数可以是钩子回调函数,比如Hook函数;包装类可以是wrapper。
202、响应于接口调用指令,确定待调用接口。
其中,本申请实施例的系统可以提供面向前端提供调用入口,当检测到用户触发调用入口时,确定用户请求调用系统的接口,也即确定接收到接口调用指令。而响应于接口调用指令,系统会查询用户对哪个系统接口请求调用,将用户请求调用的系统接口作为待调用接口,其中,待调用接口可以是系统中的任一系统接口,本申请对此不进行具体限定。
需要说明的是,实际应用的过程中,为了减少不必要的操作,从而提升效率,可以在第一次请求调用一系统接口时,将该系统接口对应的待调用资源类存储在系统内存中,这样,后续便可以直接使用缓存数据,避免重复执行资源类的生成过程。因此,在一个可选地实施方案中,响应于接口调用指令,确定待调用接口后,系统可以先查询待调用接口是否存在历史调用记录,也即判断待调用接口是否为首次调用。相应地,若待调用接口存在历史调用记录,则表示待调用接口并非首次调用,系统内存中会存储该待调用接口对应的待调用资源类,因此,系统会读取系统内存,在系统内存缓存的数据中获取待调用资源类,以及加载待调用资源类,其中,待调用资源类是在待调用接口首次被调用时生成并缓存至系统内存的。相反,若待调用接口不存在历史调用记录,则表示该待调用接口是首次被调用,系统内存中是不会存储该待调用接口对应的待调用资源类的,因此,系统会执行获取待调用接口在被调用时依赖的接口资源,并基于包装类对接口资源进行处理得到待调用资源类的过程,而且当成功生成待调用资源类时,系统会将待调用资源类缓存至系统内存中,以供下一次调用该待调用接口时能够直接使用系统内存中缓存的资源类,避免重复计算,提升操作效率。
203、查询待调用接口的接口调用代码,根据接口调用代码,获取接口资源,采用包装类对接口资源进行处理,将接口资源的数据类型转换为类,得到待调用资源类。
在本申请实施例中,确定了待调用接口后,由于待调用接口的调用实际上需要依赖一些数据资源,这些数据资源成功加载后才能够使待调用接口被成功调用,因此,系统会获取待调用接口在被调用时依赖的接口资源。其中,在获取接口资源时,系统会查询待调用接口的接口调用代码,按照接口调用代码的指示,查询待调用接口在被调用时的接口数据,获取接口数据的句柄,将句柄作为接口资源,比如将接口数据的Handle作为接口资源,这样,可以直接通过加载接口资源实现待调用接口的调用,无需再去执行查表等操作来获取接口资源,一定程度上能够节省重复的工作量,提升效率。
在获取到接口资源后,由于需要使用包装类代替Mutex,因此,系统会获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类。其中,包装类可以是wrapper,wrapper是一个函数或类,可以让基本数据类型变成类,有了类的特点后,便能够调用类中的方法。进一步,wrapper是一种设计模式,其目的是在不改变接口的情况下包装一个类的功能。在Vulkan Layer Hook中,可以创建一个封装Vulkan句柄的wrapper类,该类隐藏了Vulkan句柄的实现细节,并为该句柄提供了线程安全的访问机制。这样,本申请实施例中就可以在整个系统中使用wrapper类而不是原始的Vulkan句柄,从而避免使用互斥量对性能造成影响。因为只有在创建和销毁Vulkan句柄时才需要进行同步,而在这些操作期间Vulkan句柄的使用是串行的,因此性能的影响很小。另外,通过使用wrapper类,本申请实施例还可以方便地实现一些额外的功能,例如资源管理、性能调优等,从而提高系统的整体性能。
204、加载待调用资源类,执行待调用接口的调用操作。
在本申请实施例中,当生成待调用资源类后,系统便可以通过加载待调用资源类,执行待调用接口的调用操作。
实际应用的过程中,考虑到有时会同时接收到请求对待调用接口进行调用的多个调用指令,为了加快指令的处理效率,本申请实施例提出了一种并行调用的方案,也即当同时接收到请求对待调用接口进行调用的多个调用指令时,获取待调用接口的待调用资源类,采用多个并行线程同时加载待调用资源类,并行执行待调用接口的调用操作,并在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理。通过并行加载待调用资源类,提高接口的调用效率,相较于之前采用Mutex的方案,无需等待上一调用者解锁,可以多个调用者同时并行调用接口,在并发较大的场景下拥有更加良好的表现。
205、在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理。
在本申请实施例中,由于钩子的功能是在Vulkan API调用时对其进行拦截,并对其进行修改或执行其他操作,以达到调试、监控、性能分析等目的,因此,在检测到待调用接口被成功调用时,系统会调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理。其中,在在每个钩子函数内,可以执行多种操作,如检查输入参数的有效性、修改返回值、检查资源使用情况、记录API调用日志等,这些操作可以让开发人员更好地了解程序的运行状态,从而更好地解决问题、优化性能和实现其他功能。
实际应用的过程中,由于同时调用的钩子函数可能不止一个,多个钩子函数会涉及到大量的计算,因此,系统也可以创建多个钩子线程,通过使用多个钩子线程来提高效率,加速计算过程。
另外,实际应用的过程中,由于有些系统接口后续可以不再需要调用,或者说用户不希望系统接口的句柄占用系统内存,因此,在另一个可选地实施方案中,系统还提供句柄的销毁操作,也即当检测到请求对一系统接口执行句柄销毁操作时,系统会查询系统接口对应的待销毁资源类,其中,待销毁资源类是基于包装类对系统接口在被调用时依赖的接口资源进行处理得到的,并对待销毁资源类执行销毁操作。
这样,通过本申请的技术方案,使用Wrapper封装Vulkan中的Handle,以避免创建大量互斥量,降低互斥量对性能的影响;而且,本申请通过在Vulkan API调用前后插入Wrapper,以对Vulkan API进行操作,实现对Vulkan API的Hook;再有,本申请中使用Wrapper简化了互斥量的使用,从而提高了效率和性能;最后,本申请在不影响Vulkan API调用的前提下,对Vulkan API进行Hook,从而实现对Vulkan API的跟踪和调试。
本申请实施例提供的方法,响应于接口调用指令,确定待调用接口,获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类,加载待调用资源类,执行待调用接口的调用操作,在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理,使用包装类代替Mutex,基于包装类将用于与API交互的代码与钩子代码隔离,避免直接干扰钩子代码,也能够避免在钩子代码中进行大量处理,提升稳定性,解决易发生程序崩溃的问题,提高钩子函数的调用效率。
进一步地,作为图1所述方法的具体实现,本申请实施例提供了一种钩子函数的调用装置,如图3所示,所述装置包括:确定模块301,处理模块302,加载模块303和调用模块304。
该确定模块301,用于响应于接口调用指令,确定待调用接口;
该处理模块302,用于获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类;
该加载模块303,用于加载所述待调用资源类,执行所述待调用接口的调用操作;
该调用模块304,用于在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
在具体的应用场景中,该装置还包括:
插入模块,用于在所述待调用接口中插入可配置层组件;在所述可配置层组件中插入所述钩子函数,以及在所述可配置层组件中创建所述包装类。
在具体的应用场景中,该装置还包括:
查询模块,用于查询所述待调用接口是否存在历史调用记录;
读取模块,用于若所述待调用接口存在所述历史调用记录,则读取系统内存,在所述系统内存缓存的数据中获取所述待调用资源类,以及加载所述待调用资源类,其中,所述待调用资源类是在所述待调用接口首次被调用时生成并缓存至所述系统内存的;
该处理模块302,还用于若所述待调用接口不存在所述历史调用记录,则执行获取所述待调用接口在被调用时依赖的接口资源,并基于包装类对所述接口资源进行处理得到待调用资源类的过程,其中,当成功生成所述待调用资源类时,将所述待调用资源类缓存至所述系统内存中。
在具体的应用场景中,该处理模块302,用于查询所述待调用接口的接口调用代码,根据所述接口调用代码,获取所述接口资源;采用所述包装类对所述接口资源进行处理,将所述接口资源的数据类型转换为类,得到所述待调用资源类。
在具体的应用场景中,该处理模块302,用于按照所述接口调用代码的指示,查询所述待调用接口在被调用时的接口数据;获取所述接口数据的句柄,将所述句柄作为所述接口资源。
在具体的应用场景中,该加载模块303,还用于当同时接收到请求对所述待调用接口进行调用的多个调用指令时,获取所述待调用接口的所述待调用资源类;采用多个并行线程同时加载所述待调用资源类,并行执行所述待调用接口的调用操作;
该调用模块304,还用于在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
在具体的应用场景中,该装置还包括:
销毁模块,用于当检测到请求对一系统接口执行句柄销毁操作时,查询所述系统接口对应的待销毁资源类,其中,所述待销毁资源类是基于所述包装类对所述系统接口在被调用时依赖的接口资源进行处理得到的;对所述待销毁资源类执行销毁操作。
本申请实施例提供的装置,响应于接口调用指令,确定待调用接口,获取待调用接口在被调用时依赖的接口资源,基于包装类对接口资源进行处理,得到待调用资源类,加载待调用资源类,执行待调用接口的调用操作,在检测到待调用接口被成功调用时,调用钩子函数,以及基于钩子函数对待调用接口的调用过程进行数据处理,使用包装类代替Mutex,基于包装类将用于与API交互的代码与钩子代码隔离,避免直接干扰钩子代码,也能够避免在钩子代码中进行大量处理,提升稳定性,解决易发生程序崩溃的问题,提高钩子函数的调用效率。
需要说明的是,本申请实施例提供的一种钩子函数的调用装置所涉及各功能单元的其他相应描述,可以参考图1和图2中的对应描述,在此不再赘述。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
在示例性实施例中,参见图4,还提供了一种计算机设备,该计算机设备包括总线、处理器、存储器和通信接口,还可以包括输入输出接口和显示设备,其中,各个功能单元之间可以通过总线完成相互间的通信。该存储器存储有计算机程序,处理器,用于执行存储器上所存放的程序,执行上述实施例中的钩子函数的调用方法。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现所述的钩子函数的调用方法的步骤。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施场景所述的方法。
本领域技术人员可以理解附图只是一个优选实施场景的示意图,附图中的模块或流程并不一定是实施本申请所必须的。
本领域技术人员可以理解实施场景中的装置中的模块可以按照实施场景描述进行分布于实施场景的装置中,也可以进行相应变化位于不同于本实施场景的一个或多个装置中。上述实施场景的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
上述本申请序号仅仅为了描述,不代表实施场景的优劣。
以上公开的仅为本申请的几个具体实施场景,但是,本申请并非局限于此,任何本领域的技术人员能思之的变化都应落入本申请的保护范围。
Claims (9)
1.一种钩子函数的调用方法,其特征在于,包括:
响应于接口调用指令,确定待调用接口;
查询所述待调用接口是否存在历史调用记录;
若所述待调用接口不存在所述历史调用记录,则获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类,其中,当成功生成所述待调用资源类时,将所述待调用资源类缓存至系统内存中;
加载所述待调用资源类,执行所述待调用接口的调用操作;
在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理;
其中,在查询所述待调用接口是否存在历史调用记录时,若所述待调用接口存在所述历史调用记录,则读取系统内存,在所述系统内存缓存的数据中获取所述待调用资源类,以及加载所述待调用资源类,其中,所述待调用资源类是在所述待调用接口首次被调用时生成并缓存至所述系统内存的。
2.根据权利要求1所述的方法,其特征在于,所述响应于所述待调用接口的接口调用指令,确定待调用接口之前,所述方法还包括:
在所述待调用接口中插入可配置层组件;
在所述可配置层组件中插入所述钩子函数,以及在所述可配置层组件中创建所述包装类。
3.根据权利要求1所述的方法,其特征在于,所述获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类,包括:
查询所述待调用接口的接口调用代码,根据所述接口调用代码,获取所述接口资源;
采用所述包装类对所述接口资源进行处理,将所述接口资源的数据类型转换为类,得到所述待调用资源类。
4.根据权利要求3所述的方法,其特征在于,所述根据所述接口调用代码,获取所述接口资源,包括:
按照所述接口调用代码的指示,查询所述待调用接口在被调用时的接口数据;
获取所述接口数据的句柄,将所述句柄作为所述接口资源。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当同时接收到请求对所述待调用接口进行调用的多个调用指令时,获取所述待调用接口的所述待调用资源类;
采用多个并行线程同时加载所述待调用资源类,并行执行所述待调用接口的调用操作;
在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当检测到请求对一系统接口执行句柄销毁操作时,查询所述系统接口对应的待销毁资源类,其中,所述待销毁资源类是基于所述包装类对所述系统接口在被调用时依赖的接口资源进行处理得到的;
对所述待销毁资源类执行销毁操作。
7.一种钩子函数的调用装置,其特征在于,包括:
确定模块,用于响应于接口调用指令,确定待调用接口;
查询模块,用于查询所述待调用接口是否存在历史调用记录;
处理模块,用于若所述待调用接口不存在所述历史调用记录,则获取所述待调用接口在被调用时依赖的接口资源,基于包装类对所述接口资源进行处理,得到待调用资源类,其中,当成功生成所述待调用资源类时,将所述待调用资源类缓存至系统内存中;
加载模块,用于加载所述待调用资源类,执行所述待调用接口的调用操作;
调用模块,用于在检测到所述待调用接口被成功调用时,调用钩子函数,以及基于所述钩子函数对所述待调用接口的调用过程进行数据处理;
其中,所述装置还包括读取模块,用于在查询所述待调用接口是否存在历史调用记录时,若所述待调用接口存在所述历史调用记录,则读取系统内存,在所述系统内存缓存的数据中获取所述待调用资源类,以及加载所述待调用资源类,其中,所述待调用资源类是在所述待调用接口首次被调用时生成并缓存至所述系统内存的。
8.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至6中任一项所述方法的步骤。
9.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至6中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310301529.6A CN116010112B (zh) | 2023-03-27 | 2023-03-27 | 钩子函数的调用方法、装置、计算机设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310301529.6A CN116010112B (zh) | 2023-03-27 | 2023-03-27 | 钩子函数的调用方法、装置、计算机设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116010112A CN116010112A (zh) | 2023-04-25 |
CN116010112B true CN116010112B (zh) | 2023-06-09 |
Family
ID=86025193
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310301529.6A Active CN116010112B (zh) | 2023-03-27 | 2023-03-27 | 钩子函数的调用方法、装置、计算机设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116010112B (zh) |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130332910A1 (en) * | 2012-05-22 | 2013-12-12 | Nec Laboratories America, Inc. | Dynamic livelock analysis of multi-threaded programs |
US11314565B2 (en) * | 2016-07-07 | 2022-04-26 | Data Accelerator Ltd | Method and system for application virtualization that includes resource access control |
CN111290747B (zh) * | 2020-03-07 | 2022-06-24 | 苏州浪潮智能科技有限公司 | 一种创建函数钩子的方法、系统、设备及介质 |
CN114595008A (zh) * | 2020-12-03 | 2022-06-07 | 武汉斗鱼鱼乐网络科技有限公司 | 系统资源管理方法及相关设备 |
CN113127050B (zh) * | 2021-04-28 | 2024-03-22 | 上海米哈游璃月科技有限公司 | 一种应用资源打包过程监控方法、装置、设备和介质 |
CN115705297A (zh) * | 2021-08-17 | 2023-02-17 | 腾讯科技(深圳)有限公司 | 代码调用检测方法、装置、计算机设备以及存储介质 |
CN113986402A (zh) * | 2021-10-28 | 2022-01-28 | 上海米哈游璃月科技有限公司 | 函数调用方法、装置、电子设备及存储介质 |
-
2023
- 2023-03-27 CN CN202310301529.6A patent/CN116010112B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN116010112A (zh) | 2023-04-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6779187B1 (en) | Method and system for dynamic interception of function calls to dynamic link libraries into a windowed operating system | |
US8074116B2 (en) | Exception raised notification | |
US10339031B2 (en) | Efficient method data recording | |
US7840967B1 (en) | Sharing data among isolated applications | |
US6223335B1 (en) | Platform independent double compare and swap operation | |
US10102047B2 (en) | In-memory data analytic system that provides an integrated tracking mechanism for explicit memory resources | |
US20120222051A1 (en) | Shared resource access verification | |
US20040172639A1 (en) | Method for dynamically generating a wrapper | |
US8458336B2 (en) | State machine event restoration | |
US7472401B2 (en) | Computer product for a dynamically generated wrapper class | |
CN112214267A (zh) | 一种安卓脱壳加速方法、装置、存储介质及计算机设备 | |
US8272001B2 (en) | Management of resources based on association properties of association objects | |
CN111309407A (zh) | 集成第三方库的处理方法及装置 | |
US8209707B2 (en) | Gathering state information for an application and kernel components called by the application | |
US8429621B2 (en) | Component lock tracing by associating component type parameters with particular lock instances | |
US20240134659A1 (en) | Java bytecode injection methods and apparatuses, electronic devices, and storage media | |
CN114116509A (zh) | 程序分析方法、装置、电子设备和存储介质 | |
CN116010112B (zh) | 钩子函数的调用方法、装置、计算机设备及可读存储介质 | |
US11656850B2 (en) | System and method for bounded recursion with a microservices or other computing environment | |
De Boer et al. | Decidability problems for actor systems | |
US7908375B2 (en) | Transparently externalizing plug-in computation to cluster | |
EP1221085A2 (en) | Method and system for dynamic injection of execution logic into a windowed operating system | |
US20230359440A1 (en) | Externally-initiated runtime type extension | |
CN115186257A (zh) | 一种Android平台so中隐蔽执行任务的方法及系统 | |
Harrison et al. | Patterns for Reducing Locking Overhead in Multi-threaded Programs |
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 |