程序调试方法及系统的制作方法

文档序号:6607516阅读:185来源:国知局

专利名称::程序调试方法及系统的制作方法程序调试方法及系统
技术领域
:本发明涉及软件设计领域,特别涉及一种程序调试方法及系统。
背景技术
:在软件设计领域,调试是开发过程中必不可少的环节,通用的桌面操作系统与嵌入式操作系统在调试环境上存在明显的差别。前者,调试器与被调试的程序往往是运行在同一台机器的相同的操作系统上的两个进程,调试器进程通过操作系统专门提供的调用接口(早期UNIX系统的ptrace调用、如今的进程文件系统等)控制、访问被调试程序进程。后者(又称为远程调试),为了向系统开发人员提供灵活、方便的调试界面,调试器还是运行于通用桌面操作系统的应用程序,被调试的程序则运行于基于特定硬件平台的嵌入式操作系统(也称目标操作系统)。这就带来以下问题调试器与被调试程序如何通信,被调试程序产生异常如何及时通知调试器,调试器如何控制、访问被调试程序,调试器如何识别有关被调试程序的多任务信息并控制某一特定任务,调试器如何处理某些与目标硬件平台相关的信息(如目标平台的寄存器信息、机器代码的反汇编等)。总之,嵌入式系统的开发调试是比较困难的。而在现有技术中使用最为广泛的一种嵌入式系统开发调试方式,就是通过目标机器上的UART接口或者USB接口向系统开发人员使用的电脑上输出调试信息。这些系统开发人员在设计程序时,在可能出现程序错误的位置加入检验机制,以便在程序出错后打印特定的字符串来充当调试信息。但是这种方法存在以下一些缺点1.由于程序运行可能出错的地方很多,从理论上讲每一次的函数调用都有可能出错,因此严谨的程序调试应该判断每一次函数调用的返回值。但是如果每个函数调用都设计一次错误输出信息,那么设计错误输出信息的工作量就占了整个编码工作的很大一部分;2.很多错误类型都是一致的,例如动态分配内存失败,可能在程序运行的许多地方都会出现。如果同类型错误都输出相同的错误信息,则无法迅速找到出错位置;如果打印不同的信息,则不仅技术难度较高而且工作量也大;3.由于实际设计时设计唯一确定的输出信息的难度较大,所以导致系统开发人员经常忽略某些不常出现的错误,会导致程序隐藏一些缺陷。同时,设计的错误输出信息也不好清除,在产品正式量产后还可能遗留在产品中。因此,亟待提出一种先进的、可以克服上述缺点的技术方案。
发明内容本发明的目的在于提供一种程序调试方法及系统,其利用编译器自动生成错误信息,有利于快速定位程序出错位置。为了达到本发明的目的,根据本发明的一个方面,本发明提供一种应用于嵌入式开发平台的程序调试方法,所述方法包括设定一个宏定义或自定义库函数,所述宏定义或自定义库函数内包括一逻辑,该逻辑判断程序运行到某一点时的当前值是否为期望值,如不是,则打印当前文件名和行号;和在需要检验的程序部位加入所述宏定义或自定义库函3数。进一步地,所述打印当前文件名和行号是通过编程语言的预定义宏实现的。进一步地,除了打印当前文件名和行号外,还打印函数名。进一步地,所述程序采用C语言或者C++语言实现。进一步地,所述宏定义或者自定义库函数在打印当前文件名和行号后,还包括停止当前程序运行。根据本发明的另一方面,本发明还提供一种应用于嵌入式开发平台的程序调试系统,所述系统包括编译器,编译包括预定宏定义或自定义库函数的待调试程序,所述预定宏定义或自定义库函数内包括判断程序运行到某一点时的当前值是否为期望值,如不是,则打印当前文件名和行号的逻辑;和调试器,如果在所述程序运行到所述点时当前值不是期望值,打印所述点所处的文件名和行号。进一步地,所述调试器除了打印当前文件名和行号外,还打印函数名。进一步地,所述程序采用C语言或者C++语言实现。进一步地,所述调试器在打印当前文件名和行号后,还停止当前程序运行。与现有技术相比,本发明通过利用宏定义或者自定义库函数机制,简化了系统开发人员在设计调试信息时的工作步骤;本发明通过直接利用编程语言内部的预定义宏,实现了简洁的错误信息输出;本发明通过出错后打印的调试信息(文件名、行号或者函数名),实现了程序出错位置的快速定位。结合参考附图及接下来的详细描述,本发明将更容易理解,其中同样的附图标记对应同样的结构部件,其中图1为本发明中程序调试方法的方法流程图;图2为本发明中宏定义或者库函数的工作步骤;和图3为本发明中程序调试系统在一个实施例中的结构方框图。具体实施方式为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。本发明所述程序调试方法主要应用于嵌入式开发环境,所述嵌入式开发环境使用的编程语言可以是C语言或者C++。请参考图1,其示出了本发明中程序调试方法100的方法流程图。所述程序调试方法100包括步骤102,设定一个宏定义或者自定义库函数,所述宏定义或自定义库函数内包括一逻辑,该逻辑判断程序运行到某一点时的当前值是否为期望值,如不是,则打印当前文件名和行号;及步骤104,在需要检验的程序部位加入所述宏定义或者自定义库函数。在C语言及其相似类型的编程语言中,宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串,宏通常是用“《define"语句定义的。通俗来讲,系统开发人员可以将经常使用的一些字符串、常量等等在软件的开头部位预先声明定义用一个特定字符串来代表,然后在后续的软件设计时通过这个特定的字符串来代表那些被声明了的字4符串、常量等等。在具体的程序被编译时,编译器会自动将这个特定的字符串替换为那些被声明了的字符串、常量。在标准C语言中,编译器内部包括一些经常使用的预定义宏,诸如—FILE—、—LINE—和—FUNCTION—。—FILE—是代表当前源代码文件名的字符串文字;—LINE—是代表当前源代码中的行号的整数常量;—FUNCTION—代表当前所在函数名。具体的宏定义、预定义宏的使用方法本领域技术人员应当了解,本文不做深入讲解,详细资料可以参照各标准C语言的技术文档。本发明中充分利用预定义宏—FILE—、—LINE—和—FUNCTION—的特性,设计一个用于调试程序的宏定义,所述宏定义的工作步骤包括判断程序运行到某一点时的当前值是否为期望值,如不是,则利用预定义宏—FILE—和—LINE—打印当前文件名和行号。当然也可以利用预定义宏—FUNCTION—打印当前函数名。程序调试时检验程序是否出错通常检验三种1、代码执行之前必须具备的特性,比如变量a必须在进入函数A前是正数;2、代码执行之后必须具备的特性,比如函数B的返回值b应当是负数;3、代码执行前后不能变化的特性,比如一些变量在不同函数之间传递参数时的需要。不论哪一种,都可以通过判断机制来检验程序运行时的情况是否与预先设计的情况相吻合,当不吻合时给出出错信息。步骤102设定的宏定义正是用来检验程序是否出错的。为了更详尽的描述本发明,图2进一步说明了步骤102设定的宏定义的工作步骤200。所述宏定义的工作步骤200包括步骤202,检验程序运行时的当前值是否为设计程序时的期望值,如果是,则进行步骤204,即不做任何处理;如果不是,则代表程序出错了,进行步骤206,即打印当前源代码所处的文件名和行号;如果需要停止程序继续运行,进行步骤208,中断当前程序。在一个具体的实施例中,所述宏定义MMD_ASSERT的设定格式可以如下#defineMMD_ASSERT(_X_){if(!_X_)判断当前值是否为期望值***/VIM_UART_Printf("\nAsserterrorat%S,Line=%d",_FlLE_,_LINE_);/***打印当前文件名和行号***/While(I);}}/#*使程序陷入死循环,中断运行***/其中_X_用来判断当前值是否为期望值,_X_在当前值是期望值时为真;当然,_X_在当前值不是期望值时为假,可以根据具体实施环境令_χ_等于不同的判断条件。不同的技术人员根据具体应用环境可能对所述宏定义有不同的修改,还可能使用类似手段来实现所述宏定义的功能,例如利用自定义库函数来代替所述宏定义,例如设计一个头文件vim_assert,h,文件内容如下intMMD_ASSERT1(a){if(!a)Printf("\nAsserterrorat%S,Line=%d,,,—FILE—,—LINE—);While(I);}}/***MMD_ASSERT1可以打印文件名和行号***/intMMD_ASSERT2(b){if(!b)Printf("\nAsserterrorat%S,Function=%S,,,—FILE—,—FUNCTION—);While(I);}}5/*#MMD_ASSERT2可以打印文件名和函数名***/intMMD_ASSERT3(c){if(!c)Printf("\nAsserterrorat%S,Function=%S,Line=%d。,,,—FILE—,_LINE_,—FUNCTION—);While(I);}}/***MMD_ASSERT3可以打印文件名、行号和函数名***/将这个头文件vim_aSSert.h放在编译器可以找到的路径,并且在需要使用的程序头加入“include〈路径\vim_assert.h>”也可以达到同样的效果。在步骤104中,系统开发人员只需要在程序中需要检验的部位适当地加入步骤102中设定的宏定义或者自定义库函数即可。譬如在声明了宏定义MMD_ASSERT的程序中,文件XXX.c中的函数A的返回值a应当等于3,则在函数A的下一行(该文件16行)加入MMD_ASSERT(a=3),当a不等于3时,程序就会返回错误信息Asserterroratxxx.c,Line=16。应当认识到,本发明应用于嵌入式系统开发调试时输出的错误信息直接对应出错位置,系统开发人员可以利用输出的错误信息方便快捷地进行程序调试。而且在设计时不需要像现有技术中具体设计错误输出信息和错误处理操作,所述程序调试方法简单快捷。最后当产品调试完毕,不需要错误信息输出时只需要将软件头部的宏定义修改为空即可,大大减少了系统开发人员的工作量。基于所述程序调试方法,本发明还提供一种程序调试系统,应用于嵌入式开发平台,请参考图3,其示出了本发明中程序调试系统300在一个实施例中的结构方框图。所述程序调试系统300包括编译器302和调试器304。所述编译器302编译包括预定宏定义或自定义库函数的待调试程序,所述预定宏定义或自定义库函数内包括判断程序运行到一点的当前值是否为期望值,如不是,则打印当前文件名和行号的逻辑。由于所述待调试程序通常采用C语言或者C++来实现,所以所述编译器302的编译方式也可以与标准C语言或者C++的编译器相同,所述编译方式也包括从源代码(sourcecode)—预处理器(preprocessor)—编译器(compiler)—汇编程序(assembler)—目标代码(objectcode)—链接器(Linker)—可执行程序的(executables)的全部编译过程,直到源代码翻译成直接能被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)。如果在所述程序运行到所述点时当前值不是期望值,则所述调试器304打印所述点所在的文件名和行号。当然根据所述预定宏定义或自定义库函数内不同的逻辑,所述调试器还可以打印函数名和在程序出错时停止当前程序运行以便于系统开发人员调试。上述说明已经充分揭露了本发明的具体实施方式。需要指出的是,熟悉该领域的技术人员对本发明的具体实施方式所做的任何改动均不脱离本发明的权利要求书的范围。相应地,本发明的权利要求的范围也并不仅仅局限于所述具体实施方式。权利要求一种程序调试方法,应用于嵌入式开发平台,其特征在于,其包括设定一个宏定义或自定义库函数,所述宏定义或自定义库函数内包括一逻辑,该逻辑判断程序运行到某一点时的当前值是否为期望值,如不是,则打印当前文件名和行号;和在需要检验的程序部位加入所述宏定义或自定义库函数。2.根据权利要求1所述的程序调试方法,其特征在于,所述打印当前文件名和行号是通过编程语言的预定义宏实现的。3.根据权利要求1所述的程序调试方法,其特征在于,除了打印当前文件名和行号外,还打印函数名。4.根据权利要求1所述的程序调试方法,其特征在于,所述程序采用C语言或者C++语言实现。5.根据权利要求1所述的程序调试方法,其特征在于,所述宏定义或者自定义库函数在打印当前文件名和行号后,还包括停止当前程序运行。6.一种程序调试系统,应用于嵌入式开发平台,其特征在于,其包括编译器,编译包括预定宏定义或自定义库函数的待调试程序,所述预定宏定义或自定义库函数内包括判断程序运行到某一点时的当前值是否为期望值,如不是,则打印当前文件名和行号的逻辑;和调试器,如果在所述程序运行到所述点时当前值不是期望值,打印所述点所处的文件名和行号。7.根据权利要求6所述的程序调试系统,其特征在于,所述调试器除了打印当前文件名和行号外,还打印函数名。8.根据权利要求6所述的程序调试系统,其特征在于,所述程序采用C语言或者C++语言实现。9.根据权利要求6所述的程序调试系统,其特征在于,所述调试器在打印当前文件名和行号后,还停止当前程序运行。全文摘要本发明揭露了一种应用于嵌入式开发平台的程序调试方法,所述方法包括设定一个宏定义或自定义库函数,所述宏定义或自定义库函数内包括一逻辑,该逻辑判断程序运行到一点时的当前值是否为期望值,如不是,则打印当前文件名和行号;和在需要检验的程序点加入所述宏定义或自定义库函数。基于该方法本发明同时提出一种程序调试系统。本发明通过利用宏定义或者自定义库函数机制,简化了系统开发人员在设计调试信息时的工作步骤;本发明通过直接利用编程语言内部的预定义宏,实现了简洁的独一无二的错误信息输出;本发明通过出错后打印的调试信息实现了程序出错位置的快速定位。文档编号G06F11/36GK101916223SQ20101025033公开日2010年12月15日申请日期2010年8月11日优先权日2010年8月11日发明者李志刚申请人:无锡中星微电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1