CN112000583A - 一种调试信息抓取方法及其装置 - Google Patents
一种调试信息抓取方法及其装置 Download PDFInfo
- Publication number
- CN112000583A CN112000583A CN202010982842.7A CN202010982842A CN112000583A CN 112000583 A CN112000583 A CN 112000583A CN 202010982842 A CN202010982842 A CN 202010982842A CN 112000583 A CN112000583 A CN 112000583A
- Authority
- CN
- China
- Prior art keywords
- cache
- information
- log file
- cache area
- debugging information
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 238000007639 printing Methods 0.000 claims description 27
- 239000000872 buffer Substances 0.000 claims description 19
- 238000012545 processing Methods 0.000 claims description 16
- 238000009795 derivation Methods 0.000 claims description 3
- 230000007547 defect Effects 0.000 abstract 1
- 230000015654 memory Effects 0.000 description 29
- 230000006870 function Effects 0.000 description 19
- 230000008569 process Effects 0.000 description 14
- 238000004891 communication Methods 0.000 description 8
- 238000004590 computer program Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 6
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000004617 sleep duration Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/1805—Append-only file systems, e.g. using logs or journals to store data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例提供了一种调试信息抓取方法及其装置,方法应用于***,***包括缓存区A和缓存区B,方法包括:关中断;***对第一日志参数进行打印输出,获得第一调试信息;将第一调试信息存储至缓存区A;开中断;***将缓存区域从缓存区A切换至缓存区B;***将缓存区A中的信息写到日志文件中,并将缓存区A中的信息清零;其中,缓存区A中的信息至少包括第一调试信息;***将缓存区域从缓存区B切换至缓存区A。采用本申请的方法,能够避免现有技术中的缺陷,本实施例具有通用性。
Description
技术领域
本申请涉及电子技术领域,尤其涉及一种调试信息抓取方法及其装置。
背景技术
目前市面上有各种各样的终端设备,在对终端设备的嵌入***软件的开发过程中,工程师们通常需要进行调试,最典型的调试方法是在代码中添加打印函数,常用的打印函数为printf和printk,其函数原型分别为int printf(char*fmt,...)和int printk(char*fmt,...),当然也有厂商自己定义打印函数。
打印函数是把要打印的信息通过UART/USB/JTAG口实时输出,但此类型的打印函数也存在一些弊端,例如,大量使用会严重影响嵌入式***的性能;如果在中断中使用,或者频率使用,会引起***或某个功能出现异常;在掉电后调试信息会丢失等。
发明内容
本申请实施例公开了一种调试信息抓取方法及其装置,旨在解决现有技术中抓取日志函数不能在中断中大量使用、大量使用影响***性能以及掉电后日志易丢失的问题。
第一方面,本申请实施例提供了一种调试信息抓取方法,该方法应用于***,所述***包括缓存区A和缓存区B,所述方法包括:关中断;所述***对第一日志参数进行打印输出,获得第一调试信息;将所述第一调试信息存储至所述缓存区A;开中断;所述***将缓存区域从所述缓存区A切换至所述缓存区B;所述***将所述缓存区A中的信息写到日志文件中,并将所述缓存区A中的信息清零;其中,所述缓存区A中的信息至少包括所述第一调试信息;所述***将缓存区域从所述缓存区B切换至所述缓存区A。
可以看到,***对第一日志参数进行打印输出,获得第一调试信息,并将第一调试信息存储至缓存区A;在将缓存区A中的信息写入到日志文件之前,需要将缓存区域切换为缓存区B,使用缓存区B存储调试信息;将缓存区A中的信息写入到日志文件,并将缓存区A中的信息清零;这样缓存区A中的信息就存储至日志文件中了,再将缓存区域切换为缓存区A,使用缓存区A存储调试信息,可以将缓存区B中的信息写入到日志文件中,再将缓存区B中的信息清零,以此类推,使用缓存区A和缓存区B交替存储调试信息,再将缓存区A和缓存区B中的信息交替写入到日志文件中。
本申请中,在对日志参数进行打印之前,进行了关闭中断的操作,这样能够防止其他任务打断该打印输出过程;***设置了两个缓存区,两个缓存区均用于缓存调试信息,在将其中一个缓存区中的调试信息存储至日志文件之前,切换为另一个缓存区对调试信息进行存储,这样一个缓存区执行读入操作,一个缓存区执行写操作,避免了现有技术中打印调试信息的任务与存储调试信息的任务同时操作一个缓存区而产生冲突的情况;***将其中一个缓存区中的数据写到日志文件中时,完全不会影响打印另一个缓存区的调试信息的操作,提高了打印调试信息的效率,又避免了现有技术中无法在中断中大量打印调试信息的操作。
基于第一方面,在可能的实施例中,在所述***将缓存区域从所述缓存区A切换至所述缓存区B之后,所述方法还包括:关中断;所述***对第二日志参数进行打印输出,获得第二调试信息;将所述第二调试信息存储至所述缓存区B;开中断。
可以理解,在将缓存区域切换为缓存区B之后,可以将打印输出的第二调试信息存储至缓存区B中,且在对第二日志参数进行打印输出之前,需要关闭中断,防止打印输出任务被中断。
基于第一方面,在可能的实施例中,在所述***将缓存区域从所述缓存区A切换至所述缓存区B之前,所述方法还包括:创建写日志文件的任务;所述任务存在睡眠状态和唤醒状态;相应的,所述***将缓存区域从所述缓存区A切换至所述缓存区B,包括:在所述任务处于唤醒状态时,所述***将缓存区域从所述缓存区A切换至所述缓存区B。
可以看到,预先创建写日志文件的任务,该任务存在睡眠状态和唤醒状态两种状态,该任务的状态是通过定时器来控制的。自上次写日志文件操作完毕开始计时,当达到设置的时长时,任务处于唤醒状态,会执行写日志文件的操作,当该任务完成后,再次计时,同时任务处于睡眠状态,直到再次到达设置的时长,任务再次处于唤醒状态。
在任务处于睡眠状态的情况下,一个缓存区域A(B)用于存储调试信息,在任务处于唤醒状态时,切换缓存区域,也就是将缓存区A(B)切换为缓存区域B(A),然后用缓存区域B(A)存储调试信息,将缓存区A(B)中的调试信息写入到日志文件中,其中任务睡眠状态的睡眠时长可以根据缓存区域的大小和实际应用中调试信息的多少来定义。
基于第一方面,在可能的实施例中,在所述***将所述缓存区A中的信息写到日志文件中之前,所述方法还包括:所述***判断所述日志文件的当前大小是否大于或等于设定的阈值;经判断,在所述日志文件的当前大小大于或等于设定的阈值的情况下,对所述日志文件中的信息进行处理。
可以理解,在将缓存区A中的信息写到日志文件中之前,需要判断日志文件的当前大小是否大于或等于阈值,若日志文件的当前大小大于或等于阈值,需要对日志文件中的信息进行处理,再将缓存区中的信息存储至日志文件,此步骤是防止日志文件过大,超过***的剩余存储空间。
基于第一方面,在可能的实施例中,在所述***将所述缓存区A中的信息写到日志文件中之后,所述方法还包括:所述***将所述日志文件导出至计算机中,并通过所述计算机显示所述日志文件。
可以看到,在将缓存区中的信息写到日志文件之后,可以通过显示屏显示日志文件。
第二方面,本申请实施例提供了一种调试信息抓取装置,包括:
中断处理单元,用于关中断;
打印输出单元,用于对第一日志参数进行打印输出,获得第一调试信息;
存储单元,用于将所述第一调试信息存储至所述缓存区A;
所述中断处理单元,还用于开中断;
切换单元,用于将缓存区域从所述缓存区A切换至所述缓存区B;
写入单元,用于将所述缓存区A中的信息写到日志文件中,并将所述缓存区A中的信息清零;其中,所述缓存区A中的信息至少包括所述第一调试信息;
所述切换单元,还用于将缓存区域从所述缓存区B切换至所述缓存区A。
基于第二方面,在可能的实施方式中,所述打印输出单元,还用于对第二日志参数进行打印输出,获得第二调试信息;所述存储单元,还用于将所述第二调试信息存储至所述缓存区B。
基于第二方面,在可能的实施方式中,所述装置还包括初始化单元,所述初始化单元,用于创建写日志文件的任务;所述任务存在睡眠状态和唤醒状态;相应的,所述切换单元还用于,在所述任务处于唤醒状态的情况下,将缓存区域从所述缓存区A切换至所述缓存区B。
基于第二方面,在可能的实施方式中,所述判断单元,还用于判断所述日志文件的当前大小是否大于或等于设定的阈值;所述写入单元,还用于经判断,在所述日志文件的当前大小大于或等于设定的阈值的情况下,对所述日志文件中的信息进行处理。
基于第二方面,在可能的实施方式中,所述装置还包括导出单元,所述导出单元,用于将所述日志文件导出至计算机中,并通过所述计算机显示所述日志文件。
上述装置中各个功能单元用于实现第一方面描述的方法或第一方面的任意实施例所描述的方法。
第三方面,本申请实施例提供了一种设备,包括存储器和处理器,所述存储器用于存储指令,所述处理器用于调用所述存储器中存储的指令,执行第一方面或第一方面的任一可能实施例中所述的方法。
第四方面,本申请实施例提供了一种非易失性存储介质,用于存储程序指令,当该程序指令应用于设备时,可用于实现第一方面或第一方面的任一可能实施例中所述的方法。
第五方面,本申请实施例提供了一种计算机程序产品,该计算机程序产品包括程序指令,当该计算机程序产品被设备执行时,该设备执行前述第一方面所述方法。该计算机程序产品可以为一个软件安装包,在需要使用前述第一方面的任一种可能的设计提供的方法的情况下,可以下载该计算机程序产品并在设备上执行该计算机程序产品,以实现第一方面或第一方面的任一可能实施方式中所述的方法。
可以看到,本申请实施例提供了一种调试信息抓取方法及其装置,方法包括:预先创建写日志文件的任务,该任务一共有两种状态:睡眠状态和唤醒状态,通过定时器改变任务的状态;当任务处于睡眠状态时,使用缓存区A存储调试信息,当任务处于唤醒状态时,***切换为缓存区B存储调试信息,将缓存区A中的信息写入日志文件中,并将缓存区A中的信息清零,继续使用缓存区B存储调试信息(任务再次处于睡眠状态),经过设定的时长后,任务再次处于唤醒状态,再次切换缓存区A存储调试信息,将缓存区B中的信息写入日志文件中,以此类推进行,实现调试信息的抓取。本申请中,打印调度信息时将调试信息直接存储在缓存中,大大提高了打印调试信息的效率,使用两个缓存区交替进行调试信息的存储,这样***将缓存区中的数据写到日志文件中时,完全不会影响到调试信息的打印,避免了现有技术中无法在中断中大量打印调试信息的操作;将调试信息存储至日志文件中,也防止了***掉电后调试信息丢失的情况。
附图说明
为了更清楚地说明本申请实施例技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种调试信息抓取方法的流程示意图;
图2为本申请实施例提供的又一种调试信息抓取方法的流程示意图;
图3为本申请实施例提供的一种初始化流程示意图;
图4为本申请实施例提供的一种打印输出和存储调试信息的流程示意图;
图5为本申请实施例提供的一种将调试信息写入日志文件的流程示意图;
图6为本申请实施例提供的一种调试信息抓取装置的示意图;
图7为本申请实施例提供的一种设备示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,在本申请实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
需要说明的是,当在本说明书和所附权利要求书中使用时,术语“包括”以及它们的任何变形,意图在于覆盖不排他的包含。例如包含了一系列单元/器件的***、产品或者装置没有限定于已列出的单元/器件,而是可选地还包括没有列出的单元/器件,或者还可选地包括这些产品或者装置固有的其他单元/器件。
还应当理解,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”或“在…的情况下”。
还需要说明的是,本说明书和权利要求书中的术语“第一”“第二”“第三”“第四”等用于区别不同的对象,而并非用于描述特定的顺序。
参考图1,图1为本申请实施例提供的一种调试信息抓取方法的流程示意图,该方法应用于***,***包括缓存区A和缓存区B,该方法包括但不限于以下S101~S103的内容。
S101、关中断,***对第一日志参数进行打印输出,获得第一调试信息,将第一调试信息存储至缓存区A,开中断。
***在对第一日志参数进行打印之前,需要先关闭中断,目的是防止***中的其他任务打断该过程;在对第一日志参数打印输出之后,打开中断,使***中的任务切换功能恢复正常。
在一种实施例中,使用标准c语言中的库函数va_start获取第一日志参数地址,对第一日志参数进行打印输出,获得第一调试信息,再使用库函数vsnprintf将第一调试信息以字符串格式存储到缓存区A中,其中,每次的缓存地址为log_buf[0].buf+log_buf[0].offset,log_buf[0].buf表示缓存区A,log_buf[0].offset表示缓存区A当前的调试信息的长度,即偏移地址。需要说明的是,vsnprintf函数每次存储的数据大小不超过LOG_BUF_SIZE-1-log_buf[0].offset,即log_buf[0].buf总共存储的调试信息大小不会超过缓存大小减1(缓存最后一位预留为0,即字符串结束字符),多余的数据会被丢弃;当缓存满时log_buf[0].offset的值为LOG_BUF_SIZE-1,此时,LOG_BUF_SIZE-1-log_buf[0].offset的值为0,函数vsnprintf不会再把此次的调试信息存缓存起来,防止发生内存溢山。
S102、***将缓存区域从缓存区A切换至缓存区B,将缓存区A中的信息写到日志文件中,并将缓存区A中的信息清零,其中,缓存区A中的信息至少包括第一调试信息。
***在将缓存区A中的信息写到日志文件之前,需要将缓存区域由缓存区A切换至缓存区B,以便后续打印输出的调试信息存储至缓存区B中。***将缓存区A中的信息写入到日志文件中,并将缓存区A中的信息清零,以备下一次使用,其中,缓存区A中的信息至少包括第一调试信息。
本申请中,在读取其中一个缓存区中的信息然后写入日志文件时,另一个缓存区可用于存储后续打印输出的调试信息,这样避免了存储调试信息到日志文件的任务影响到打印输出调试信息的操作,提高了打印效率。
S103、***将缓存区域从缓存区B切换至缓存区A。
在将缓存区A中的信息清零以后,缓存区A中没有任何信息,可以将缓存区域由缓存区B切换为缓存区A,缓存区A用于存储调试信息。
在一种可能的实施例中,可以是每间隔一段时间,***进行一次缓存区域的切换,也就是每个缓存区域存储调试信息的时长是一样的,到了设置的时长后,立即进行缓存切换。
在又一种可能的实施例中,缓存区A可以是主缓存区,缓存区B是辅缓存区,在需要将缓存区A中的调试信息写入到日志文件之前,就将缓存区域切换至缓存区B,在将缓存区A中的调试信息写入到日志文件结束之后,再次将缓存区域切换至缓存区A。其中主缓存区A切换的条件可以根据实际应用进行设置,在此不作具体限定。在一种实施例中,用log_buf[0].buf表示缓存区A,用log_buf[1].buf表示缓存区B,则可以通过改变下标值0或1,来由缓存区A切换为缓存区B,或者由缓存区B切换为缓存区A。
可以看到,本申请实施例中,在对日志参数进行打印之前,进行了关闭中断的操作,这样能够防止其他任务打断该打印输出过程;***设置了两个缓存区,两个缓存区均用于缓存调试信息,在将其中一个缓存区中的调试信息存储至日志文件之前,切换为另一个缓存区对调试信息进行存储,这样一个缓存区执行读入操作,一个缓存区执行写操作,这样***将缓存区中的数据写到日志文件中时,完全不会影响到调试信息的打印,保证了打印调试信息的效率,避免了现有技术中无法在中断中大量打印调试信息的操作。
参见图2,图2为本申请实施例提供的又一种调试信息抓取方法的流程示意图,该方法应用于***,***包括缓存区A和缓存区B,方法包括但不限于以下S201~S207中的内容。
S201、***创建写日志文件的任务。
创建写日志文件的任务,该任务存在两种状态:睡眠状态和唤醒状态,通过定时器来改变任务的状态。在任务处于唤醒状态时,需要切换缓存区域。例如,当前使用缓存区A存储调试信息,在任务处于唤醒状态时,将缓存区A切换为缓存区B,***此后打印调试信息会将调试信息保存到缓存区B中,并将缓存区A中的调试信息写入到日志文件中,接着清除缓存区A中信息,下一次切换缓存时使用,然后任务再次处于睡眠状态,直到任务再次处于唤醒状态时,再次切换缓存区域。其中,任务处于睡眠状态的时长(也即是设置的定时器的时长)可以根据缓存区域的大小和实际应用中调试信息的多少来定义。
需要说明的是,创建写日志文件的任务属于初始化操作,只需要创建一次即可。当该任务处于唤醒状态时,***会自动将缓存中的调试信息写到日志文件中,然后任务会再次进入睡眠状态,当睡眠状态的时长达到定时器设置的时长时,任务再一次被唤醒,***将缓存中调试信息再次写入日志文件中,等等,如此循环反复。
S202、关中断,***对第一日志参数进行打印输出,获得第一调试信息,将第一调试信息存储至缓存区A,开中断。
参见S101中的描述,为了说明书的简洁,在此不再赘述。
需要说明的是,该步骤中,写日志文件任务处于睡眠状态。
S203、在任务处于唤醒状态时,***将缓存区域从缓存区A切换至缓存区B。
当睡眠状态的时长达到定时器设定的时长时,任务处于唤醒状态。当任务处于唤醒状态时,***将缓存区域从缓存区A切换至缓存区B。
在可能的实施例中,***在将缓存区域切换为缓存区B后,接收到的所有调试信息都会存储至缓存区B中。因此在收到打印第二日志参数的任务后,***会将打印输出的第二调试信息存储至缓存区B。在打印任务开始之前,***会关中断,目的是防止其他任务打断该打印任务,在打印任务结束后,***会打开中断。
需要说明的是,实际运行时,该步骤与步骤S202是并行操作的,可同时进行。
S204、***判断当前日志文件的内存是否大于或等于设定的阈值;经判断,在当前日志文件的内存大于或等于设定的阈值的情况下,更新当前日志文件的信息。
在任务处于唤醒状态时,切换缓存区域,并将缓存区A中的信息写入到日志文件中,但是在写入到日志文件之前,***判断当前日志文件的内存是否大于或等于预设的阈值,阈值是根据日志文件的总存储空间来决定的,一般日志文件的总存储空间能够存储至少2次从开机到***完全正常工作时的调试信息。
经判断,在当前日志文件的内存大于或等于设定的阈值的情况下,更新当前日志文件的信息,大概方法包括:先关闭当前日志文件,重命名该日志文件,再以写的方式打开一个新的日志文件,打开重命名的日志文件,从重命名的日志文件内容长度一半的位置开始读取日志信息,写入到新的日志文件中,删除重命名的日志文件。该步骤的目的是保证日志文件的内存足够存储新的调试信息,防止日志文件发生内存溢出。
S205、***将缓存区A中的信息写到日志文件中,并将缓存区A中的信息清零。
***将缓存区A中的信息写到日志文件中,并将缓存区A中的信息清零。
至此,写日志文件的任务结束,任务再次处于睡眠状态,可以重复执行上述S202至S205的步骤。
S206、***将日志文件进行显示。
日志文件中存储有调试信息,若需要查看调试信息,可以将日志文件导出至计算机或其他显示设备中,然后通过计算机或显示设备将日志文件中的调试信息显示出来。
S207、***将缓存区域从缓存区B切换至缓存区A。
参见S103中的描述,为了说明书的简洁,在此不再赘述。在可能的实施例中,具体实现过程,可以使用c语言中的两个结构体类型的元素分别表示缓存区A和缓存区B,通过改变两个结构体类型的元素的下标来切换不同的缓存区。
在可能的实施例中,日志文件中不同次存储的调试信息之间通过特定字符串分隔开,如特定字符串可以为“\r\n--------------\r\n”。
在可能的实施例中,写日志文件的任务的优先级较低,目的是为了不影响其他任务的运行。将定时器设置一固定时间,该固定时间可以根据缓存区的大小来确定,使得在缓存区中的信息较小时,写日志文件的任务处于睡眠状态,当缓存区中的信息较大时,写日志文件的任务唤醒。
为了更加清楚地理解本实施例,下面以c语言为例整体描述本申请中抓取调试信息的方法。
首先,设计一个存储调试信息的缓存结构体struct log_st,如下,其中,数据buf为存储调试信息的缓存区域,MAX_BUF_SIZE为buf的大小,这个大小根据实际的内存情况来定义,offset表示当前缓存中调试信息的长度,同时也代表下一次调试信息存储在缓存中的偏移量。以该缓存结构体为元素定义一个数组,使得数组包含2个缓存结构体类型的元素:log_buf[0]和log_buf[1],两个元素分别代表两个缓存区。需要说明的是,用int型全局变量index作为数组中元素log_buf的下标,切换缓存的操作通过index=1-index实现。
然后,在对日志参数进行打印之前,先进行初始化操作,参考图3所示的流程示意图,初始化操作主要包括:
S301、创建写日志文件的任务;
S302、打开日志文件,写特定字符串,关闭日志文件;如”\r\n--------------\r\n”到日志文件中,这样多次重启后可以通过观察日志文件中的该标识区分每次的调试信息。
其次,对日志参数进行打印输出,并将输出的调试信息存储至缓存区域中,参考图4所示的流程示意图,该过程可具体描述为:
S401、判断打印标记是否开启,若是,则执行如下;
S402、初始化变量va_list ap,int len;ap指向参数列表,len表示此次成功缓存日志的长度;
S403、关中断;
S404、使用标准C库函数va_start(ap,fmt)获取打印参数地址;
S405、保用标准C库函数将vsnprintf将调试信息以字符串格式存储到缓存中,vsnprintf(log_buf[index].buf+log_buf[index].offset,LOG_BUF_SIZE-1-log_buf[index].offset,fmt,ap);每次缓存地址为log_buf[index].buf+log_buf[index].offset;
S406、使用标准C库函数va_end(ap)将ap置为空;
S407、计算出本次调试信息的大小,并将log_buf[index].offset加上该长度;
len=strlen(log_buf[index].buf+log_buf[index].offset);
log_buf[index].offset+=len;
strlen也是标准的C库函数,计算此次成功存储调试信息的长度;
S408、开中断。
最后,将缓存区域中的信息写入到日志文件中,参考图5所示的流程示意图,该过程包括:
S501、任务处于睡眠状态;
S502、在任务处于唤醒状态时,切换调试信息缓存区;即更新缓存数组下标index的值,方法是index=1–index;
S503、判断日志文件的内存是否大于或等于阈值;若是,则执行S504操作;若否,执行S505操作;
S504、对日志文件中的信息进行处理;
这个限定值应根据实际文***剩余空间大小来决定,且保证能够存储至少2次从开机到***完全正常工作时的调试信息;
删除日志文件前半部分的方法如图4所示,先关闭日志文件,然后重命名日志文件,再以写的方法打开一个新的日志文件,且打开重命令的日志文件,从重命令的日志文件的大小一半的位置开始读取日志信息,存储到新的日志文件中,读完之后,删除这个重命名的日志文件;
S505、从1-index指示的缓存中读取长度为offset的调试信息写入到日志文件中;
S506、将从1-index指示缓存数据清0,并将其offset的值置为0。
可以看到,本申请实施例提供了一种调试信息抓取方法,当任务处于唤醒状态时,切换为缓存区B存储调试信息,此后***打印调试信息时会将这些信息存储到缓存区B,然后将缓存区A中的信息写入日志文件中,并将缓存区A中的信息清零,然后任务处于睡眠状态,当任务再次处于唤醒状态时,再次切换缓存区A存储调试信息,将缓存区B中的信息写入日志文件中,以此类推进行,实现调试信息的抓取。本申请,打印调度信息时将调试信息直接存储在缓存中,大大提高了打印调试信息的效率,使用两个缓存区交替进行调试信息的存储,这样***将缓存区中的数据写到日志文件中时,完全不会影响到调试信息的打印,避免了现有技术中无法在中断中大量打印调试信息的操作;将调试信息存储至日志文件中,也防止了***掉电后调试信息丢失的情况。
本申请实施例提供了一种调试信息抓取装置400的示意图,参考图6,该装置400至少包括:
中断处理单元401,用于关中断;
打印输出单元402,用于对第一日志参数进行打印输出,获得第一调试信息;
存储单元403,用于将第一调试信息存储至所述缓存区A;
中断处理单元401,还用于开中断;
切换单元404,用于将缓存区域从缓存区A切换至缓存区B;
写入单元405,用于将缓存区A中的信息写到日志文件中,并将缓存区A中的信息清零;其中,缓存区A中的信息至少包括第一调试信息;
切换单元404,还用于将缓存区域从缓存区B切换至缓存区A。
在可能的实施方式中,打印输出单元402,还用于对第二日志参数进行打印输出,获得第二调试信息;存储单元403,还用于将第二调试信息存储至缓存区B。
在可能的实施方式中,装置400还包括初始化单元406,初始化单元406用于创建写日志文件的任务;所述任务存在睡眠状态和唤醒状态;相应的,切换单元404还用于,在任务处于唤醒状态时,将缓存区域从缓存区A切换至缓存区B。
在可能的实施方式中,装置400还包括判断单元407,判断单元407,还用于判断日志文件的当前大小是否大于或等于设定的阈值;写入单元405还用于经判断,在日志文件的当前大小大于或等于设定的阈值的情况下,对日志文件中的信息进行处理。
在可能的实施方式中,装置400还包括导出单元408,导出单元408用于将日志文件中的信息导出至计算机,并通过计算机显示日志文件。
上述装置400的各功能单元可用于实现图1或图2实施例所描述的方法,具体内容可参考图1或图2实施例的相关内容中的描述,为了说明书的简洁,这里不再赘述。
参见图7,图7是本申请实施例提供的一种调试信息抓取设备600的示意图,该设备600至少包括:处理器610、通信接口620和存储器630,处理器610、通信接口620和存储器630通过总线640进行耦合。其中,
处理器610通过调用存储器630中的程序代码,用于运行图6中的中断处理单元401、打印输出单元402、切换单元404、写入单元405、初始化单元406、判断单元407、导出单元408。在实际应用中,处理器610可以包括一个或者多个通用处理器,其中,通用处理器可以是能够处理电子指令的任何类型的设备,包括中央处理器(Central Processing Unit,CPU)、微处理器、微控制器、主处理器、控制器以及ASIC(Application SpecificIntegrated Circuit,专用集成电路)等等。处理器610读取存储器630中存储的程序代码,与通信接口620配合执行本申请上述实施例中一种调试信息抓取装置400执行的方法的部分或者全部步骤。
通信接口620可以为有线接口(例如以太网接口),用于与其他计算节点或装置进行通信。当通信接口620为有线接口时,通信接口620可以采用TCP/IP之上的协议族,例如,RAAS协议、远程函数调用(Remote Function Call,RFC)协议、简单对象访问协议(SimpleObject Access Protocol,SOAP)协议、简单网络管理协议(Simple Network ManagementProtocol,SNMP)协议、公共对象请求代理体系结构(Common Object Request BrokerArchitecture,CORBA)协议以及分布式协议等等。
存储器630可以存储有程序代码以及数据信息。其中,程序代码包括中断处理单元401的代码、打印输出单元402的代码、存储单元403的代码、切换单元404的代码、写入单元405的代码、初始化单元406的代码、判断单元407的代码、导出单元408的代码。数据信息包括:第一调试信息、第二调试信息、第一阈值、第二阈值等等。在实际应用中,存储器630可以包括易失性存储器(Volatile Memory),例如随机存取存储器(Random Access Memory,RAM);存储器也可以包括非易失性存储器(Non-Volatile Memory),例如只读存储器(Read-Only Memory,ROM)、快闪存储器(Flash Memory)、硬盘(Hard Disk Drive,HDD)或固态硬盘(Solid-State Drive,SSD)存储器还可以包括上述种类的存储器的组合。
设备600还可以包括显示器或显示屏,执行导出单元408的操作,用于显示日志文件中的信息。
本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,所述计算机程序被硬件(例如处理器等)执行,以实现本申请实施例中设备执行的任意一种方法的部分或者全部步骤。
本申请实施例还提供一种计算机程序产品,当所述计算机程序产品被计算机读取并执行时,使得设备执行本申请实施例中一种调试信息抓取方法的部分或全部步骤。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、存储盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态存储盘SolidState Disk,SSD)等。在所述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置,也可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本申请实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。
Claims (10)
1.一种调试信息抓取方法,其特征在于,该方法应用于***,所述***包括缓存区A和缓存区B,所述方法包括:
关中断;所述***对第一日志参数进行打印输出,获得第一调试信息;将所述第一调试信息存储至所述缓存区A;开中断;
所述***将缓存区域从所述缓存区A切换至所述缓存区B;所述***将所述缓存区A中的信息写到日志文件中,并将所述缓存区A中的信息清零;其中,所述缓存区A中的信息至少包括所述第一调试信息;
所述***将缓存区域从所述缓存区B切换至所述缓存区A。
2.根据权利要求1所述的方法,其特征在于,在所述***将缓存区域从所述缓存区A切换至所述缓存区B之后,所述方法还包括:
关中断;所述***对第二日志参数进行打印输出,获得第二调试信息;将所述第二调试信息存储至所述缓存区B;开中断。
3.根据权利要求1所述的方法,其特征在于,在所述***将缓存区域从所述缓存区A切换至所述缓存区B之前,所述方法还包括:
创建写日志文件的任务;所述任务存在睡眠状态和唤醒状态;
相应的,所述***将缓存区域从所述缓存区A切换至所述缓存区B,包括:
在所述任务处于唤醒状态时,所述***将缓存区域从所述缓存区A切换至所述缓存区B。
4.根据权利要求1所述的方法,其特征在于,在所述***将所述缓存区A中的信息写到日志文件中之前,所述方法还包括:
所述***判断所述日志文件的当前大小是否大于或等于设定的阈值;
经判断,在所述日志文件的当前大小大于或等于设定的阈值的情况下,对所述日志文件中的信息进行处理。
5.根据权利要求1-4任一项所述的方法,其特征在于,在所述***将所述缓存区A中的信息写到日志文件中之后,所述方法还包括:
所述***将所述日志文件导出至计算机中,并通过所述计算机显示所述日志文件。
6.一种调试信息抓取装置,其特征在于,包括:
中断处理单元,用于关中断;
打印输出单元,用于对第一日志参数进行打印输出,获得第一调试信息;
存储单元,用于将所述第一调试信息存储至所述缓存区A;
所述中断处理单元,还用于开中断;
切换单元,用于将缓存区域从所述缓存区A切换至所述缓存区B;
写入单元,用于将所述缓存区A中的信息写到日志文件中,并将所述缓存区A中的信息清零;其中,所述缓存区A中的信息至少包括所述第一调试信息;
所述切换单元,还用于将缓存区域从所述缓存区B切换至所述缓存区A。
7.根据权利要求6所述的装置,其特征在于,
所述打印输出单元,还用于对第二日志参数进行打印输出,获得第二调试信息;
所述存储单元,还用于将所述第二调试信息存储至所述缓存区B。
8.根据权利要求6所述的装置,其特征在于,所述装置还包括初始化单元,
所述初始化单元,用于创建写日志文件的任务;所述任务存在睡眠状态和唤醒状态;
相应的,所述切换单元还用于,在所述任务处于唤醒状态时,将缓存区域从所述缓存区A切换至所述缓存区B。
9.根据权利要求6所述的装置,其特征在于,所述装置还包括判断单元,
所述判断单元,用于判断所述日志文件的当前大小是否大于或等于设定的阈值;
所述写入单元,还用于经判断,在所述日志文件的当前大小大于或等于设定的阈值的情况下,对所述日志文件中的信息进行处理。
10.根据权利要求6-9任一项所述的装置,其特征在于,所述装置还包括导出单元,
所述导出单元,用于将所述日志文件导出至计算机中,并通过所述计算机显示所述日志文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010982842.7A CN112000583A (zh) | 2020-09-17 | 2020-09-17 | 一种调试信息抓取方法及其装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010982842.7A CN112000583A (zh) | 2020-09-17 | 2020-09-17 | 一种调试信息抓取方法及其装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112000583A true CN112000583A (zh) | 2020-11-27 |
Family
ID=73475369
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010982842.7A Pending CN112000583A (zh) | 2020-09-17 | 2020-09-17 | 一种调试信息抓取方法及其装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112000583A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117891647A (zh) * | 2024-03-18 | 2024-04-16 | 荣耀终端有限公司 | 日志处理方法、电子设备和计算机可读存储介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5440690A (en) * | 1991-12-27 | 1995-08-08 | Digital Equipment Corporation | Network adapter for interrupting host computer system in the event the host device driver is in both transmit and receive sleep states |
CN101887393A (zh) * | 2010-07-01 | 2010-11-17 | 中兴通讯股份有限公司 | 基于半虚拟化技术的设备故障复现方法及*** |
CN103309767A (zh) * | 2012-03-08 | 2013-09-18 | 阿里巴巴集团控股有限公司 | 一种客户端日志处理方法和装置 |
CN103885726A (zh) * | 2014-03-20 | 2014-06-25 | 东蓝数码股份有限公司 | 一种高效的多线程日志写入方法 |
CN105808463A (zh) * | 2016-02-29 | 2016-07-27 | 惠州市德赛西威汽车电子股份有限公司 | 一种嵌入式***中调试信息的串口输出方法 |
CN106407028A (zh) * | 2016-08-26 | 2017-02-15 | 佛山智能装备技术研究院 | 一种双缓冲式的机器人软件日志存储方法 |
CN107590182A (zh) * | 2017-08-03 | 2018-01-16 | 华南理工大学 | 一种分布式日志收集方法 |
CN107798099A (zh) * | 2017-10-27 | 2018-03-13 | 努比亚技术有限公司 | 一种日志信息抓取方法、终端和计算机可读存储介质 |
-
2020
- 2020-09-17 CN CN202010982842.7A patent/CN112000583A/zh active Pending
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5440690A (en) * | 1991-12-27 | 1995-08-08 | Digital Equipment Corporation | Network adapter for interrupting host computer system in the event the host device driver is in both transmit and receive sleep states |
CN101887393A (zh) * | 2010-07-01 | 2010-11-17 | 中兴通讯股份有限公司 | 基于半虚拟化技术的设备故障复现方法及*** |
CN103309767A (zh) * | 2012-03-08 | 2013-09-18 | 阿里巴巴集团控股有限公司 | 一种客户端日志处理方法和装置 |
CN103885726A (zh) * | 2014-03-20 | 2014-06-25 | 东蓝数码股份有限公司 | 一种高效的多线程日志写入方法 |
CN105808463A (zh) * | 2016-02-29 | 2016-07-27 | 惠州市德赛西威汽车电子股份有限公司 | 一种嵌入式***中调试信息的串口输出方法 |
CN106407028A (zh) * | 2016-08-26 | 2017-02-15 | 佛山智能装备技术研究院 | 一种双缓冲式的机器人软件日志存储方法 |
CN107590182A (zh) * | 2017-08-03 | 2018-01-16 | 华南理工大学 | 一种分布式日志收集方法 |
CN107798099A (zh) * | 2017-10-27 | 2018-03-13 | 努比亚技术有限公司 | 一种日志信息抓取方法、终端和计算机可读存储介质 |
Non-Patent Citations (2)
Title |
---|
佚名: "双缓冲异步日志(Async Logging)", pages 1 - 6, Retrieved from the Internet <URL:《https://blog.csdn.net./daaikuaichuan/article/details/86500108》> * |
刘百祥;周超;: "高校环境下日志管理的思考与设计", 网络空间安全, no. 10, pages 107 - 120 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117891647A (zh) * | 2024-03-18 | 2024-04-16 | 荣耀终端有限公司 | 日志处理方法、电子设备和计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9015458B2 (en) | Computer system and method for updating basic input/output system by switching between local mode and bypass mode through baseboard management controller | |
CN103106163B (zh) | 基于数据帧异步传输协议的fpga芯片在线升级结构及方法 | |
TW201624273A (zh) | 韌體變量更新方法 | |
JP4641443B2 (ja) | ログ情報管理装置、ログ情報管理方法およびログ情報管理プログラム | |
JP2009110156A (ja) | ログ出力装置及びログ出力プログラム | |
CN111159114A (zh) | 文件存储方法、装置及服务器 | |
CN112000583A (zh) | 一种调试信息抓取方法及其装置 | |
CN110083491A (zh) | 一种bios初始化方法、装置、设备及存储介质 | |
CN115407943A (zh) | 一种内存转储文件生成方法、装置、设备及可读存储介质 | |
CN110221932B (zh) | 计算机及其控制方法 | |
US8775768B2 (en) | Information processing apparatus and method of controlling the same | |
CN210691297U (zh) | 一种控制器的启动装置及控制器 | |
JP2007055129A (ja) | 印刷装置、節電モード移行時間延長方法、及びプログラム | |
JP6418400B2 (ja) | 電子機器および情報処理プログラム | |
JP2009009323A (ja) | 設定装置、電子機器、及び設定プログラム | |
CN106484564B (zh) | 一种采集数据存储方法 | |
JP5163180B2 (ja) | デバイス制御装置 | |
JP2008262287A (ja) | 通信制御装置および通信ログ保存方法 | |
CN111103960B (zh) | 一种Nvme SSD及其复位方法和*** | |
JP2015115834A (ja) | 中継装置および中継装置の管理方法 | |
JPH10187454A (ja) | Bios書き換え方式 | |
CN110377446A (zh) | 一种异构混合内存***异常恢复方法及装置 | |
CN111124285B (zh) | 一种固态硬盘数据保持方法、装置、设备、介质 | |
CN104077156A (zh) | 可程序化中央处理单元的重新启动***及其方法 | |
JPH09238213A (ja) | 通信装置 |
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 |