CN116795576A - 基于日志打印的设备驱动调试方法、装置和电子设备 - Google Patents

基于日志打印的设备驱动调试方法、装置和电子设备 Download PDF

Info

Publication number
CN116795576A
CN116795576A CN202310665158.XA CN202310665158A CN116795576A CN 116795576 A CN116795576 A CN 116795576A CN 202310665158 A CN202310665158 A CN 202310665158A CN 116795576 A CN116795576 A CN 116795576A
Authority
CN
China
Prior art keywords
custom
driver
data
log
function
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.)
Pending
Application number
CN202310665158.XA
Other languages
English (en)
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.)
Suzhou Inspur Intelligent Technology Co Ltd
Original Assignee
Suzhou Inspur Intelligent Technology 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 Suzhou Inspur Intelligent Technology Co Ltd filed Critical Suzhou Inspur Intelligent Technology Co Ltd
Priority to CN202310665158.XA priority Critical patent/CN116795576A/zh
Publication of CN116795576A publication Critical patent/CN116795576A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/079Root cause analysis, i.e. error or fault diagnosis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种基于日志打印的设备驱动调试方法、装置和电子设备,属于计算机技术领域,其中,基于日志打印的设备驱动调试方法包括:创建并封装自定义打印函数;基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装;运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件;将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。本发明可以指定日志打印路径,便于快速获取特定的调试信息,并对设备驱动运行状态进行自动分析,灵活性较好,效率较高。

Description

基于日志打印的设备驱动调试方法、装置和电子设备
技术领域
本发明涉及计算机技术领域,尤其涉及一种基于日志打印的设备驱动调试方法、装置和电子设备。
背景技术
在通用操作系统中,驱动常常以模块的形式加载到内核中运行,驱动的可靠性对系统至关重要。现有技术在对驱动程序进行调试的过程中,通过调用内核原有的打印函数printk对日志信息进行集中打印,可控性差,打印路径无法指定,大量的日志信息集中输出到系统消息文件中,导致系统消息过大,不便于快速获取特定的调试信息并进行自动分析,灵活性较差,效率较低。
发明内容
本发明提供一种基于日志打印的设备驱动调试方法、装置和电子设备,用以解决现有技术在对驱动程序进行调试的过程中,通过调用内核原有的打印函数printk对日志信息进行集中打印,打印路径无法指定,不便于快速获取特定的日志信息并进行自动分析,灵活性较差,效率较低的缺陷。
第一方面,本发明提供一种基于日志打印的设备驱动调试方法,包括:
创建并封装自定义打印函数;
基于调试目的,在驱动程序中添加所述自定义打印函数,并对增加了所述自定义打印函数的所述驱动程序进行编译和安装;
运行所述驱动程序,调用所述自定义打印函数,输出自定义日志数据至指定文件;
将所述指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
在一些实施例中,所述创建并封装自定义打印函数之前,还包括:
创建缓冲区,并定义所述缓冲区的读写指针和读写操作;
创建锁和数据保存线程;
其中,所述缓冲区存在于内核中,用于缓存所述自定义日志数据,所述数据保存线程为内核线程;
其中,所述读写操作包括:每写入一个新的数据前,判断所述缓冲区是否已存满数据,若是,则读指针向后移动1位,丢弃一个已存数据,在所述缓冲区中写入一个新的数据,若否,则直接在所述缓冲区中写入一个新的数据,写指针向后移1位;每读取一个数据前,判断所述缓冲区是否为空,若是,则不执行读取操作,若否,则读取所述缓冲区中的一个数据,读指针向后移1位。
在一些实施例中,所述运行所述驱动程序,调用所述自定义打印函数,输出自定义日志数据至指定文件,包括:
运行所述驱动程序,调用所述自定义打印函数,得到所述自定义打印函数传递过来的自定义日志数据;
对所述缓冲区进行加锁,基于所述读写操作,将所述自定义日志数据写入所述缓冲区,在所述自定义日志数据均写入所述缓冲区后,对所述缓冲区进行解锁;
启动所述数据保存线程,对所述缓冲区进行加锁,读取所述缓冲区中的自定义日志数据,将所述缓冲区中的自定义日志数据写入指定文件,在完成将所述缓冲区中的自定义日志数据写入指定文件后,对所述缓冲区进行解锁,退出所述数据保存线程。
在一些实施例中,所述缓冲区包括临时缓冲区和数据缓冲区,所述将所述自定义日志数据写入所述缓冲区,包括:
将所述自定义日志数据写入所述临时缓冲区;
读取所述临时缓冲区中的自定义日志数据,确定所述自定义日志数据对应的数据类型;
基于所述数据类型,将所述临时缓冲区中的自定义日志数据分类写入所述数据缓冲区中。
在一些实施例中,所述封装自定义打印函数,包括以下之一:
将所述自定义打印函数与所述驱动程序封装在一个工程中;
将所述自定义打印函数封装为单独的工程,并将所述自定义打印函数开放给内核。
在一些实施例中,所述基于调试目的,在驱动程序中添加所述自定义打印函数,包括以下至少一项:
在所述调试目的是跟踪驱动执行过程的情况下,在所述驱动程序的执行函数中加入所述自定义打印函数;
在所述调试目的是跟踪消息交互过程的情况下,在所述驱动程序的消息传递函数中加入所述自定义打印函数;
在所述调试目的是跟踪错误执行过程的情况下,在所述驱动程序的错误函数中加入所述自定义打印函数。
在一些实施例中,所述自定义日志数据包括:内核日志和设备驱动调试日志数据;
所述指定文件包括:开放给用户空间的文件系统下的指定路径的文件;或者,本地磁盘上的自定义路径日志文件。
第二方面,本发明还提供一种基于日志打印的设备驱动调试装置,包括:
构建单元,用于创建并封装自定义打印函数;
配置单元,用于基于调试目的,在驱动程序中添加所述自定义打印函数,并对增加了所述自定义打印函数的所述驱动程序进行编译和安装;
输出单元,用于运行所述驱动程序,调用所述自定义打印函数,输出自定义日志数据至指定文件;
分析单元,用于将所述指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
第三方面,本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述基于日志打印的设备驱动调试方法。
第四方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述基于日志打印的设备驱动调试方法。
本发明提供的一种基于日志打印的设备驱动调试方法、装置和电子设备,通过创建并封装自定义打印函数,基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装,运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件,将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析,可以指定打印路径,便于快速获取特定的调试信息并进行自动分析,灵活性较好,效率较高。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的基于日志打印的设备驱动调试方法的流程示意图之一;
图2是本发明实施例提供的调用自定义打印函数输出自定义日志数据至指定文件的流程示意图之一;
图3是本发明实施例提供的调用自定义打印函数输出自定义日志数据至指定文件的流程示意图之二;
图4是本发明实施例提供的基于日志打印的设备驱动调试方法的流程示意图之二;
图5是本发明实施例提供的基于日志打印的设备驱动调试装置的结构示意图;
图6是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在设备驱动程序开发、测试及正常运行过程中,均需要对设备驱动进行调试。现有技术通过内核原有的打印函数printk进行程序调试,几乎内核任何地方都可以调用printk,可控性差,打印路径无法指定,这也就导致了打印内容非常多,而且打印位置较集中,由于需要开启守护进程且存在一些无效的输出导致打印效率低。如果需要进行定制化开发或者对特定的调试信息进行处理,就需要对日志内容进行检索和筛选,这样既不灵活,也不方便,调试效率也不高。同时大量的调试信息输出到系统消息文件中,导致系统消息内容过大,关键内容易被覆盖掉,不利于后续对驱动问题进行分析。
为此,本发明提供了一种基于日志打印的设备驱动调试方法、装置和电子设备,通过创建并封装自定义打印函数,基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装,运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件,将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。本发明可以指定日志打印路径,便于快速获取特定的调试信息并进行自动分析,灵活性较好,效率较高。
图1为本发明实施例提供的基于日志打印的设备驱动调试方法的流程示意图之一。如图1所示,提供了一种基于日志打印的设备驱动调试方法,包括以下步骤:步骤110、步骤120、步骤130和步骤140。该方法流程步骤仅仅作为本发明一个可能的实现方式。
步骤110、创建并封装自定义打印函数。
其中,自定义打印函数是指用户自己定义的打印函数。
可选地,自定义打印函数可以为debug_printk函数,相比于内核原有的printk函数,debug_printk函数更加轻量级,debug_printk函数只在内核编译时使用DEBUG_KERNEL宏定义时才会被编译并打印输出。
需要说明的是,对自定义打印函数进行封装是指将该函数包装在一个更大的代码块中,以便可以更方便、更容易地调用该函数。例如,可以将自定义打印函数封装在一个函数库中,在需要使用该函数的时候,只需要调用函数库中的该特定函数即可。这样可以使代码更加模块化,便于对其进行维护,并且在多个代码文件中使用同样的函数时,也可以更方便地共享。
可以理解的是,用户可以根据开发或测试需求创建自定义打印函数,并对自定义打印函数进行封装,进而便于调用自定义打印函数,输出不同类型的数据,增强输出效果和用户体验,灵活性较强。
步骤120、基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装。
其中,驱动程序是需要进行调试的程序对象,驱动程序的执行过程一般包括设备初始化、内部指令处理、中断处理、添加设备、消息请求和回复、错误处理等过程。
可选地,调试目的可以为在驱动程序开发过程中发现和排除错误、在测试中发现和定位设备问题或在运行中发现和定位故障问题等。
可选地,基于调试目的,可以设置打印时间、日志级别、打印函数、需要输出的参数等。
可选地,可以在驱动程序中添加debug_printk函数,并对增加了debug_printk函数的驱动程序进行编译和安装。
可以理解的是,基于调试目的,在驱动程序的打印位置添加自定义打印函数,对增加了自定义打印函数的驱动程序进行编译和安装,将自定义打印函数集成到操作系统中,以便在打印时能够使用这些自定义打印函数,从而能够提高打印的灵活性和定制性,满足不同用户对打印输出的各种需求,确保打印系统的稳定性和可靠性。
步骤130、运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件。
可选地,可以调用debug_printk函数,输出自定义日志数据至指定文件。
可选地,可以使用EXPORT_SYMBOL函数,将debug_printk函数导出,方便其他驱动程序调用。
可选地,可以在系统重新启动后,通过cat/proc/debugmsg查看自定义日志数据,也可以通过应用程序使用open、read或write函数进行系统调用,对自定义日志数据进行打开、读取或写入操作。
其中,自定义日志是指用户自行定义的日志,用于记录系统或应用程序运行时的各种信息,例如错误信息、警告信息、调试信息等。
需要说明的是,用户可以根据具体要求自定义日志格式、级别、输出方式等,以便更好地分析驱动程序的运行状况,发现和解决潜在问题。自定义日志通常涉及以下几个方面:
1)日志级别:不同的日志级别对应不同的输出要求,日志级别通常包括调试级、信息级、警告级、错误级、致命级等,在开发调试时通常默认为调试级,在测试和投入运行时通常默认为警告级;
2)日志格式:用户可以自主设置日志格式,如时间、日志级别、文件路径、函数名、自定义信息等;
3)日志输出:用户可以自主选择合适的输出方式,将自定义日志输出到不同的地方,如控制台、文件、数据库、邮件、远程服务器等;
4)日志管理:日志管理工具有多种,如日志分割工具、日志清除工具、日志归档工具、可视化界面工具等。
其中,指定文件是指指定了输出路径的文件。
可以理解的是,运行驱动程序,调用自定义打印函数,进而可以按照特定的输出方式输出特定格式和级别的自定义日志数据至指定文件,从而可以为后续对设备驱动运行状态进行自动监测提供数据基础,提高测试的自动化和灵活性水平,帮助用户更好地了解驱动程序的运行状况,及时发现和解决问题,提高系统性能和稳定性。
步骤140、将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
可以理解的是,将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析,进而能够及时发现问题并定位问题,根据分析结果对驱动程序进行修改,再次运行修改后的程序,并进行自定义日志数据的打印和分析,查看是否纠正错误,直到驱动程序的运行符合预期并稳定运行,从而能够提高设备驱动调试效率。
在本发明实施例中,通过创建并封装自定义打印函数,基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装,运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件,将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析,可控性较强,可以指定打印路径,便于快速获取特定的调试信息并进行自动分析,灵活性较好,效率较高。
需要说明的是,本发明每一个实施方式可以自由组合、调换顺序或者单独执行,并不需要依靠或依赖固定的执行顺序。
在一些实施例中,创建并封装自定义打印函数之前,还包括:
创建缓冲区,并定义缓冲区的读写指针和读写操作;
创建锁和数据保存线程。
其中,缓冲区存在于内核中,用于缓存自定义日志数据,数据保存线程为内核线程。
示例性地,创建数据缓冲区debug_buf,类型为char型数组,存储方式为static,数据缓冲区的长度为1024。
其中,读写指针包括读指针debuglog_r和写指针debuglog_w,缓冲区每读取一个数据,读指针后移一位,读指针总是指向下一个要读取的位置,当读指针后移到缓冲区尾部时,则其跳转到缓冲区最开始的位置重新开始;缓冲区每写入一个数据,写指针后移一位,写指针总是指向下一个要写的位置,当写指针后移到缓冲区尾部时,则跳转到缓冲区最开始的位置重新开始;如果debuglog_r=debuglog_w,则表示缓冲区是空的,如果写指针的下一个位置是读指针,即debuglog_r=debuglog_w+1,则表示缓冲区是满的。
其中,读写操作包括:每写入一个新的数据前,判断缓冲区是否已存满数据,若是,则读指针向后移动1位,丢弃一个已存数据,在缓冲区中写入一个新的数据,若否,则直接在缓冲区中写入一个新的数据,写指针向后移1位;每读取一个数据前,判断缓冲区是否为空,若是,则不执行读取操作,若否,则读取缓冲区中的一个数据,读指针向后移1位。
可选地,利用create_proc_entry函数在虚拟文件系统/proc目录下生成一个文件debugemsg,定义对虚拟文件的操作函数,分为read、write和open函数,分别用于对缓冲区进行读操作、写操作和打开操作。
其中,锁是一种用于控制临界区访问的同步工具,当一个线程获得锁时,其他线程需要等待它释放锁才能访问共享数据区,锁能够确保某一时刻只有一个线程能够访问共享数据,以避免多个线程访问共享数据从而产生竞争,导致应用程序出现数据错误或内存泄漏等问题。
其中,数据保存线程属于内核线程,完全运行在内核空间中,可以访问系统的全部资源,包括物理内存、设备、文件系统等。
可以理解的是,通过创建缓冲区,并定义缓冲区的读写指针和读写操作,可以对数据进行缓存,避免了频繁地访问外部设备,从而能够提高数据访问和处理效率,提高系统的稳定性和可靠性,提高用户的体验;通过创建锁和数据保存线程,进而能够将缓冲区数据写入指定文件,不仅能够有效保证数据的正确性和一致性,而且能够提高数据保存的效率和安全性。
图2为本发明实施例提供的调用自定义打印函数输出自定义日志数据至指定文件的流程示意图之一。如图2所示,步骤130运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件,包括步骤131、步骤132和步骤133。
步骤131、运行驱动程序,调用自定义打印函数,得到自定义打印函数传递过来的自定义日志数据。
可选地,可以利用va_start函数读取自定义打印函数传递过来的自定义日志数据。
步骤132、对缓冲区进行加锁,基于读写操作,将自定义日志数据写入缓冲区,在自定义日志数据均写入缓冲区后,对缓冲区进行解锁。
可选地,可以使用vsnprintf函数将自定义日志数据写入到缓冲区中。
步骤133、启动数据保存线程,对缓冲区进行加锁,读取缓冲区中的自定义日志数据,将缓冲区中的自定义日志数据写入指定文件,在完成将缓冲区中的自定义日志数据写入指定文件后,对缓冲区进行解锁,退出数据保存线程。
可选地,可以利用kernel_thread函数启用数据保存线程,读取缓冲区中的自定义日志数据,利用内核提供的kernel_write函数将读取的数据写入到指定文件中。
可选地,可以将自定义日志数据保存在/root/debugmsg_file下。
图3为本发明实施例提供的调用自定义打印函数输出自定义日志数据至指定文件的流程示意图之二。如图3所示,包括以下步骤:
步骤301、在驱动程序模块中加入封装的自定义函数模块;
步骤302、在驱动程序中增加自定义打印函数;
步骤303、对驱动程序进行编译和安装;
步骤304、运行驱动程序;
步骤305、判断是否调用了自定义打印函数debug_printk,若是,则执行步骤306,若否,则执行步骤304;
步骤306、对缓冲区进行加锁;
步骤307、在缓冲区中写入自定义日志数据直到遇到“\0”;
步骤308、对缓冲区进行解锁;
步骤309、启动数据保存线程;
步骤310、读取缓冲区中的数据;
步骤311、将缓冲区中的数据写入指定文件中;
步骤312、判断是否完成将缓冲区中的数据写入指定文件中,若是,则执行步骤313,若否,则执行步骤310;
步骤313、对缓冲区进行解锁;
步骤314、退出线程。
可以理解的是,通过运行驱动程序,调用自定义打印函数,进而能够得到自定义打印函数传递过来的自定义日志数据,通过采用锁将自定义日志数据写入缓冲区,通过利用锁和数据保存线程,读取缓冲区中的自定义日志数据,将缓冲区中的自定义日志数据写入指定文件,不仅能够实现自定义日志数据的实时写入和读出,保障数据读写操作的正确性和安全性,而且能够提高数据读写效率。
在一些实施例中,缓冲区包括临时缓冲区和数据缓冲区,将自定义日志数据写入缓冲区,包括:
将自定义日志数据写入临时缓冲区;
读取临时缓冲区中的自定义日志数据,确定自定义日志数据对应的数据类型;
基于数据类型,将临时缓冲区中的自定义日志数据分类写入数据缓冲区中。
其中,临时缓冲区用于存储临时的日志数据并对其进行组合,它可以在需要的时候暂存数据,等到合适的时机再将暂存的数据移动到数据缓冲区中。
可选地,临时缓冲区可以为tmp_buf,类型和数据长度与数据缓冲区debug_buf相同。
可选地,使用vsnprintf函数将自定义日志数据存入临时缓冲区,最后将该数据写入到数据缓冲区中,当遇到“%”字符时进行数据类型判断,将不同类型的数据填充到数据缓冲区对应位置,直到遇到“\0”时,结束对数据的处理。
可以理解的是,通过将自定义日志数据写入临时缓冲区,读取临时缓冲区中的自定义日志数据,确定自定义日志数据对应的数据类型,基于数据类型,将临时缓冲区中的自定义日志数据分类写入数据缓冲区中,从而可以避免在数据缓冲区中频繁执行数据写入操作影响程序性能,提高了数据缓存效率。
在一些实施例中,封装自定义打印函数,包括以下之一:
将自定义打印函数与驱动程序封装在一个工程中;
将自定义打印函数封装为单独的工程,并将自定义打印函数开放给内核。
可以理解的是,通过将自定义打印函数与驱动程序封装在一个工程中,共用一个Makefile,进而能够进行整体的编译、安装、运行和调试,可以提高自定义打印函数与驱动程序之间的兼容性,避免调用自定义打印函数时发生冲突。
通过将自定义打印函数封装为单独的工程,单独使用一个Makefile,并将自定义打印函数开放给内核,以供其他程序调用,驱动程序就可以使用自定义打印函数进行打印调试,从而能够在不同的驱动程序中使用同一个自定义打印函数进行调试,简化了驱动程序的调试过程,提高了驱动程序的调试效率。
在一些实施例中,基于调试目的,在驱动程序中添加自定义打印函数,包括以下至少一项:
在调试目的是跟踪驱动执行过程的情况下,在驱动程序的执行函数中加入自定义打印函数;
在调试目的是跟踪消息交互过程的情况下,在驱动程序的消息传递函数中加入自定义打印函数;
在调试目的是跟踪错误执行过程的情况下,在驱动程序的错误函数中加入自定义打印函数。
可以理解的是,为了验证驱动程序是否实现了预期执行过程和结果,可以在驱动程序的执行函数中加入自定义打印函数,进而可以打印执行日志数据,从而可以通过对执行日志数据进行分析,发现错误并对驱动程序进行修改,再次进行打印调试,直到驱动程序的运行符合预期并稳定运行;为了对驱动程序的消息交互过程进行跟踪,可以在驱动程序的消息传递函数中加入自定义打印函数,进而可以打印消息交互日志,分析消息交互的链路状态,从而快速定位问题并及时作出响应;为了对驱动程序的错误执行过程进行跟踪,可以在驱动程序的错误函数中加入自定义打印函数,进而可以打印错误告警日志,便于分析问题,及时排除问题,降低故障停机损失。
在一些实施例中,自定义日志数据包括:内核日志和设备驱动调试日志数据;
指定文件包括:开放给用户空间的文件系统下的指定路径的文件;或者,本地磁盘上的自定义路径日志文件。
其中,内核日志是指操作系统内核输出的各种信息和错误记录,包括系统启动时的进程、设备驱动程序的加载信息,以及在系统运行过程中出现的各种异常和报错信息等。
其中,设备驱动调试日志是指在设备驱动程序调试过程中输出的日志信息,通常记录了设备驱动程序运行中的各种状态和响应信息,以及在驱动程序出现异常情况时的错误信息。
可选地,可以通过文件系统中的/proc/debugmsg对自定义日志数据进行实时查询,也可以通过访问本地磁盘查看自定义日志数据。
可以理解的是,通过将内核日志和设备驱动调试日志分开存放,保存在指定文件中,便于对自定义日志数据进行查询,可以清晰地查看驱动程序的整体工作过程,进而便于对驱动程序存在的问题进行快速分析,及时排除问题,从而能够缩短开发和测试时间。
图4为本发明实施例提供的基于日志打印的设备驱动调试方法的流程示意图之二。如图4所示,包括以下步骤:
步骤401、创建数据缓冲区;
步骤402、定义数据缓冲区的读写操作;
步骤403、创建自定义打印函数;
步骤404、创建自旋锁和线程;
步骤405、将自定义打印函数封装到驱动程度中,并进行编译,运行驱动程序;
步骤406、调用自定义打印函数,得到自定义日志数据,将其存入数据缓冲区;
步骤407、定义并打开日志文件;
步骤408、开启线程,读取数据缓冲区中的自定义日志数据,将读取的自定义日志数据写入日志文件;
步骤409、将数据缓冲区的自定义日志数据保存在/proc文件系统中;
步骤410、读取生成的日志文件并对其进行分析。
在本发明实施例中,通过创建数据缓冲区、自定义打印函数、锁和线程,定义数据缓冲区的读写操作,为自定义日志数据的打印创造了良好的环境,通过将自定义打印函数封装到驱动程度中,并进行编译,运行驱动程序,调用自定义打印函数,得到自定义日志数据,将其存入数据缓冲区,定义并打开日志文件,开启线程,读取数据缓冲区中的自定义日志数据,将读取的自定义日志数据写入日志文件,将数据缓冲区的自定义日志数据保存在/proc文件系统中,便于将自定义日志数据分类写入指定文件中,灵活性较好,通过读取生成的日志文件并对其进行分析,便于及时发现问题并排除问题,提高了调试效率。
下面对本发明实施例提供的基于日志打印的设备驱动调试装置进行描述,下文描述的基于日志打印的设备驱动调试装置与上文描述的基于日志打印的设备驱动调试方法可相互对应参照。
图5为本发明提供的基于日志打印的设备驱动调试装置的结构示意图,如图5所示,该装置500包括:
构建单元510,用于创建并封装自定义打印函数;
配置单元520,用于基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装;
输出单元530,用于运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件;
分析单元540,用于将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
可选地,基于日志打印的设备驱动调试装置500还包括:
第一创建单元,用于创建缓冲区,并定义缓冲区的读写指针和读写操作;
第二创建单元,用于创建锁和数据保存线程;
其中,缓冲区存在于内核中,用于缓存自定义日志数据,数据保存线程为内核线程;
其中,读写操作包括:每写入一个新的数据前,判断缓冲区是否已存满数据,若是,则读指针向后移动1位,丢弃一个已存数据,在缓冲区中写入一个新的数据,若否,则直接在缓冲区中写入一个新的数据,写指针向后移1位;每读取一个数据前,判断缓冲区是否为空,若是,则不执行读取操作,若否,则读取缓冲区中的一个数据,读指针向后移1位。
可选地,运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件,包括:
运行驱动程序,调用自定义打印函数,得到自定义打印函数传递过来的自定义日志数据;
对缓冲区进行加锁,基于读写操作,将自定义日志数据写入缓冲区,在自定义日志数据均写入缓冲区后,对缓冲区进行解锁;
启动数据保存线程,对缓冲区进行加锁,读取缓冲区中的自定义日志数据,将缓冲区中的自定义日志数据写入指定文件,在完成将缓冲区中的自定义日志数据写入指定文件后,对缓冲区进行解锁,退出数据保存线程。
可选地,缓冲区包括临时缓冲区和数据缓冲区,将自定义日志数据写入缓冲区,包括:
将自定义日志数据写入临时缓冲区;
读取临时缓冲区中的自定义日志数据,确定自定义日志数据对应的数据类型;
基于数据类型,将临时缓冲区中的自定义日志数据分类写入数据缓冲区中。
可选地,封装自定义打印函数,包括以下之一:
将自定义打印函数与驱动程序封装在一个工程中;
将自定义打印函数封装为单独的工程,并将自定义打印函数开放给内核。
可选地,基于调试目的,在驱动程序中添加自定义打印函数,包括以下至少一项:
在调试目的是跟踪驱动执行过程的情况下,在驱动程序的执行函数中加入自定义打印函数;
在调试目的是跟踪消息交互过程的情况下,在驱动程序的消息传递函数中加入自定义打印函数;
在调试目的是跟踪错误执行过程的情况下,在驱动程序的错误函数中加入自定义打印函数。
可选地,自定义日志数据包括:内核日志和设备驱动调试日志数据;
指定文件包括:开放给用户空间的文件系统下的指定路径的文件;或者,本地磁盘上的自定义路径日志文件。
在此需要说明的是,本发明实施例提供的基于日志打印的设备驱动调试装置,能够实现上述基于日志打印的设备驱动调试方法实施例所实现的所有方法步骤,且能够达到相同的技术效果,在此不再对本实施例中与方法实施例相同的部分及有益效果进行具体赘述。
图6示例了一种电子设备的实体结构示意图,如图6所示,该电子设备可以包括:处理器(processor)610、通信接口(Communications Interface)620、存储器(memory)630和通信总线640,其中,处理器610,通信接口620,存储器630通过通信总线640完成相互间的通信。处理器610可以调用存储器630中的逻辑指令,以执行基于日志打印的设备驱动调试方法,该方法包括:创建并封装自定义打印函数;基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装;运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件;将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
此外,上述的存储器630中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的基于日志打印的设备驱动调试方法,该方法包括:创建并封装自定义打印函数;基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装;运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件;将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的基于日志打印的设备驱动调试方法,该方法包括:创建并封装自定义打印函数;基于调试目的,在驱动程序中添加自定义打印函数,并对增加了自定义打印函数的驱动程序进行编译和安装;运行驱动程序,调用自定义打印函数,输出自定义日志数据至指定文件;将指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种基于日志打印的设备驱动调试方法,其特征在于,包括:
创建并封装自定义打印函数;
基于调试目的,在驱动程序中添加所述自定义打印函数,并对增加了所述自定义打印函数的所述驱动程序进行编译和安装;
运行所述驱动程序,调用所述自定义打印函数,输出自定义日志数据至指定文件;
将所述指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
2.根据权利要求1所述的基于日志打印的设备驱动调试方法,其特征在于,所述创建并封装自定义打印函数之前,还包括:
创建缓冲区,并定义所述缓冲区的读写指针和读写操作;
创建锁和数据保存线程;
其中,所述缓冲区存在于内核中,用于缓存所述自定义日志数据,所述数据保存线程为内核线程;
其中,所述读写操作包括:每写入一个新的数据前,判断所述缓冲区是否已存满数据,若是,则读指针向后移动1位,丢弃一个已存数据,在所述缓冲区中写入一个新的数据,若否,则直接在所述缓冲区中写入一个新的数据,写指针向后移1位;每读取一个数据前,判断所述缓冲区是否为空,若是,则不执行读取操作,若否,则读取所述缓冲区中的一个数据,读指针向后移1位。
3.根据权利要求2所述的基于日志打印的设备驱动调试方法,其特征在于,所述运行所述驱动程序,调用所述自定义打印函数,输出自定义日志数据至指定文件,包括:
运行所述驱动程序,调用所述自定义打印函数,得到所述自定义打印函数传递过来的自定义日志数据;
对所述缓冲区进行加锁,基于所述读写操作,将所述自定义日志数据写入所述缓冲区,在所述自定义日志数据均写入所述缓冲区后,对所述缓冲区进行解锁;
启动所述数据保存线程,对所述缓冲区进行加锁,读取所述缓冲区中的自定义日志数据,将所述缓冲区中的自定义日志数据写入指定文件,在完成将所述缓冲区中的自定义日志数据写入指定文件后,对所述缓冲区进行解锁,退出所述数据保存线程。
4.根据权利要求3所述的基于日志打印的设备驱动调试方法,其特征在于,所述缓冲区包括临时缓冲区和数据缓冲区,所述将所述自定义日志数据写入所述缓冲区,包括:
将所述自定义日志数据写入所述临时缓冲区;
读取所述临时缓冲区中的自定义日志数据,确定所述自定义日志数据对应的数据类型;
基于所述数据类型,将所述临时缓冲区中的自定义日志数据分类写入所述数据缓冲区中。
5.根据权利要求1-4中任一项所述的基于日志打印的设备驱动调试方法,其特征在于,所述封装自定义打印函数,包括以下之一:
将所述自定义打印函数与所述驱动程序封装在一个工程中;
将所述自定义打印函数封装为单独的工程,并将所述自定义打印函数开放给内核。
6.根据权利要求1所述的基于日志打印的设备驱动调试方法,其特征在于,所述基于调试目的,在驱动程序中添加所述自定义打印函数,包括以下至少一项:
在所述调试目的是跟踪驱动执行过程的情况下,在所述驱动程序的执行函数中加入所述自定义打印函数;
在所述调试目的是跟踪消息交互过程的情况下,在所述驱动程序的消息传递函数中加入所述自定义打印函数;
在所述调试目的是跟踪错误执行过程的情况下,在所述驱动程序的错误函数中加入所述自定义打印函数。
7.根据权利要求1所述的基于日志打印的设备驱动调试方法,其特征在于,所述自定义日志数据包括:内核日志和设备驱动调试日志数据;
所述指定文件包括:开放给用户空间的文件系统下的指定路径的文件;或者,本地磁盘上的自定义路径日志文件。
8.一种基于日志打印的设备驱动调试装置,其特征在于,包括:
构建单元,用于创建并封装自定义打印函数;
配置单元,用于基于调试目的,在驱动程序中添加所述自定义打印函数,并对增加了所述自定义打印函数的所述驱动程序进行编译和安装;
输出单元,用于运行所述驱动程序,调用所述自定义打印函数,输出自定义日志数据至指定文件;
分析单元,用于将所述指定文件作为设备驱动分析程序的输入信息,对设备驱动运行状态进行自动分析。
9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至7任一项所述基于日志打印的设备驱动调试方法。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述基于日志打印的设备驱动调试方法。
CN202310665158.XA 2023-06-06 2023-06-06 基于日志打印的设备驱动调试方法、装置和电子设备 Pending CN116795576A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310665158.XA CN116795576A (zh) 2023-06-06 2023-06-06 基于日志打印的设备驱动调试方法、装置和电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310665158.XA CN116795576A (zh) 2023-06-06 2023-06-06 基于日志打印的设备驱动调试方法、装置和电子设备

Publications (1)

Publication Number Publication Date
CN116795576A true CN116795576A (zh) 2023-09-22

Family

ID=88039534

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310665158.XA Pending CN116795576A (zh) 2023-06-06 2023-06-06 基于日志打印的设备驱动调试方法、装置和电子设备

Country Status (1)

Country Link
CN (1) CN116795576A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117492877A (zh) * 2023-12-28 2024-02-02 苏州元脑智能科技有限公司 一种程序管理方法、系统、设备及介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117492877A (zh) * 2023-12-28 2024-02-02 苏州元脑智能科技有限公司 一种程序管理方法、系统、设备及介质
CN117492877B (zh) * 2023-12-28 2024-03-19 苏州元脑智能科技有限公司 一种程序管理方法、系统、设备及介质

Similar Documents

Publication Publication Date Title
US7058927B2 (en) Computer software run-time analysis systems and methods
US8473919B2 (en) System and method for repeating program flow for debugging and testing
US9015671B2 (en) Integrating program construction
EP2427822B1 (en) Exception raised notification
US8140908B2 (en) System and method of client side analysis for identifying failing RAM after a user mode or kernel mode exception
EP1236110B1 (en) A method for isolating a fault from error messages
CN106325970A (zh) 编译方法和编译系统
US7096339B2 (en) System and method for detecting memory management programming errors
CN116795576A (zh) 基于日志打印的设备驱动调试方法、装置和电子设备
JP2022513382A (ja) 関数ジャンプを実現するための方法、装置及びコンピュータ記憶媒体
CN112765032A (zh) 程序调试方法、装置、设备及存储介质
US20020073359A1 (en) System and method for high priority machine check analysis
WO2007071615A1 (en) Methods, apparatus and computer programs for handling parameters associated with call statements
CN110764962A (zh) 日志处理方法和装置
US8689206B2 (en) Isolating operating system in-memory modules using error injection
US6611924B1 (en) Reducing code size of debug output statements
EP1653344A1 (en) Embedded detection objects
CN111045891B (zh) 基于java多线程的监控方法、装置、设备以及存储介质
CN115705294A (zh) 用于获取函数调用信息的方法、装置、电子设备和介质
Andrzejak et al. Confguru-A system for fully automated debugging of configuration errors
CN115390913B (zh) 零代码侵入的日志监控方法、装置、电子设备及存储介质
Bishop et al. Integrity static analysis of COTS/SOUP
JP4192519B2 (ja) 情報処理方法および装置
US20040093537A1 (en) System for determining computer program memory allocation and deallocation
CN117591322A (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