提前认识软件开发(15) 程序调试的利器:日志

如果世界上有一个人能够保证一次写出来的代码是百分之百正确的,那么毫无疑问,他一定是世界上最优秀的程序员,没有之一。为什么要求代码写好过后要进行充分的自测(包括单元测试和集成测试)?就因为是人皆会犯错,是程序就会有bug。作为一名软件开发人员,必须要学会对程序进行测试,也就是要学会程序的调试。

一般而言,对代码的调试有以下几种方法:

第一,凭肉眼看。在开发阶段,我们编写的每一行代码都需要用我们的“火眼金睛”多审查几遍。如果要问,最好的代码调试工具是什么?我认为是人眼。不管是代码还是文档,在用工具检查之前,都需要先过了我们眼睛这一关。

第二,对代码进行编译,以发现语法错误。编译器能够帮助我们发现代码中存在的语法错误,但对于那些隐蔽性的错误(如逻辑错误等)无能为力。

第三,用代码检查工具(如Pclint等)来走查代码。如果代码编译通过,并不表示它就没有问题了。在学校的时候,我们一般认为只要程序能够运行就可以了。但在实际的软件开发项目中,程序能够跑起来,只是“万里长征走完了第一步”。用代码检查工具可以发现很多编译器无法发现的错误,如变量定义了未引用、不同数据类型之间相互赋值、函数未声明便被调用等。

第四,对代码进行调试。对于运行正常而输出结果不正确的程序,我们可以用设置断点并进行单步跟踪调试的方法来发现其中存在的问题。例如,在VC++ 6.0里面,可实现对代码的单步调试,并输出变量在某一步产生的值,可据此判断程序的逻辑的正确与否。

第五,对程序的日志文件进行分析。对代码的单步调试只在代码行数较少的时候比较适用,如学校教材上面的程序。但在实际的软件项目中,代码少则几千行,多则数万行,用单步调试的方法显然不恰当。为了跟踪某一变量值的变化,用该方法可能要花费几个小时,这对工作效率产生了严重影响。为了解决大程序文件代码调试问题,日志系统应运而生。在程序中的重要地方打印日志,之后对产生的日志进行分析,可找到对应代码的问题。因此,日志文件分析成了大型软件项目中代码调试的主要手段。

本文对日志相关内容进行详细的说明。

1.什么是日志文件?

在业务软件系统中大量使用日志,日志能够起到“按图索骥”的作用,它对于故障定位和系统正常运行维护具有举足轻重的作用。

日志文件是程序中写日志函数产生的记录程序执行情况的文件。写日志函数也是用C语言编写的,同C函数一样被调用。在恰当的地方调用该函数,可对整个程序的运行状况有一个全面的了解,方便对程序的跟踪调试。

2.有关日志等级和日志配置说明

(1)日志等级

事有轻重缓急,日志信息也有重要与不重要之分。一般按照重要程度,将日志等级分为几类。在作者参与过的软件开发项目中,共有7个等级,用宏定义表示如下:

//日志等级定义

#define LOG_FATAL        (int)1      //严重错误

#define LOG_ERROR       (int)2      //一般错误

#define LOG_WARN        (int)3       //警告信息

#define LOG_INFO          (int)4        //一般信息

#define LOG_TRACE       (int)5      //跟踪信息

#define LOG_DEBUG      (int)6     //调试信息

#define LOG_ALL            (int)7      //全部

开发人员根据所要打印的日志的具体情况采用不同的日志等级。

(2)日志配置

由于不同产品程序行数、部署情况、实现功能等的差别,对日志打印的要求也不尽相同,因此需要有配置来控制日志的产生数量和显示情况。

在配置文件中,有一个专门的[LOG]配置段,其中的配置项如下:

[LOG]

;日志等级, 0-Fatal 1-Error 2-Warn 3-Info 4-Trace 5-Debug 6-All

LogLevel=

;每个日志文件的最大容量

LogMaxSize=

;是否输出该条日志在代码中的行数, 1-Yes 0-No

LogPosition=

其中,LogLevel用于控制打印日志的等级,代码中日志等级比配置值大的日志信息均不在日志文件中显示;LogMaxSize用于控制生成一个日志文件的大小的上限,超过该值后,便重新生成文件;LogPosition用于控制是否在日志文件中显示代码行数,方便将日志与代码对应起来。

3.如何调用写日志函数?

日志函数的调用遵循一般函数的调用规则。有两类写日志函数,如下所示:

(1)第一类形如:WriteLog(LogLevel, LogInfo)。其中,参数LogLevel指日志等级(见第2节中的说明);参数LogInfo是具体要打印的日志信息,我们据此信息来检查程序的运行情况。该函数的调用示例如:WriteLog(LOG_INFO, "The value of this integer is 3."),日志等级为LOG_INFO,日志信息为“The value of this integer is 3.”(该信息会输出到日志文件中)。

(2)第二类形如:WriteLogEx(LogLevel, LogInfo, ParaInfo)。这是扩展的日志函数,不但能够输出日志信息,还能够在日志信息中显示变量的值。该函数的调用示例如:WriteLogEx(LOG_INFO, "The value of integer iInt is %d.", iInt),该日志要输出整型变量iInt的值,可以将该函数的调用与printf函数的调用比较起来看(可以认为WriteLogEx函数只是在printf函数中增加了一个日志等级参数)。

时间: 2024-11-17 11:48:36

提前认识软件开发(15) 程序调试的利器:日志的相关文章

让你提前认识软件开发(15):程序调试的利器—日志

第1部分 重新认识C语言 程序调试的利器-日志           如果世界上有一个人能够保证一次写出来的代码是百分之百正确的,那么毫无疑问,他一定是世界上最优秀的程序员,没有之一.为什么要求代码写好过后要进行充分的自测(包括单元测试和集成测试)?就因为是人皆会犯错,是程序就会有bug.作为一名软件开发人员,必须要学会对程序进行测试,也就是要学会程序的调试.          一般而言,对代码的调试有以下几种方法:         第一,凭肉眼看.在开发阶段,我们编写的每一行代码都需要用我们的"

提前认识软件开发(1) 序言

序言 正式踏上软件开发岗位已经将近两年了,经历了很多,也学到了很多."万事开头难",学生转变为职业人的过程,恰似茧化成蝶的过程. 1.为什么要写作本系列? 在工作的过程中,我发现我们在学校里面学到的很多东西片面肤浅,根本达不到岗位的要求.像编码规范.研发流程等等学校里几乎不提及的知识,在实际的软件开发项目中却恰恰是异常的重要. 在学校里面,我们欠缺的教育主要包括以下方面: 第一,对编码规范的要求.计算机编程课上,老师只要求学生能够编写程序实现既定的功能即可,几乎不会对编码规范提出要求,

让你提前认识软件开发(1):序言

序言           正式踏上软件开发岗位已经将近两年了,经历了很多,也学到了很多."万事开头难",学生转变为职业人的过程,恰似茧化成蝶的过程.          1.为什么要写作本系列?        在工作的过程中,我发现我们在学校里面学到的很多东西片面肤浅,根本达不到岗位的要求.像编码规范.研发流程等等学校里几乎不提及的知识,在实际的软件开发项目中却恰恰是异常的重要.        在学校里面,我们欠缺的教育主要包括以下方面:        第一,对编码规范的要求.计算机编程

提前认识软件开发(16) 如何对程序进行优化

对程序进行优化,是软件开发工程师必然会涉及到的问题.那么为什么要对程序进行优化呢?原因有以下几个: 第一,在原程序基础之上新增.删除或修改了功能,需要改变原程序流程.客户需求随时可能会变化,今天已经实现的功能,说不定明天就要修改或去掉.落实到程序上面,就需要我们随时准备对写好的代码进行修改,而不要奢望写好之后就永远不要动了. 第二,原程序有bug.这类情况出现得非常的频繁,很多软件有1.0.2.0.3.0等版本,部分原因就是前面版本中程序有问题,在修改程序的过程中使得软件版本不断升级. 第三,原

提前认识软件开发(14):程序中的算法

算法(Algorithm),是程序的灵魂.著名计算机科学家.图灵奖获得者沃思曾提出过一个公式:数据结构+算法=程序.可见,算法在程序中占有非常重要的地位. 在实际的软件开发项目中,不管是有意设计或是无意为之,我们几乎随时在和算法打交道.小到定义一个变量,大到编写一个函数,这些都是算法的实现过程. 本文以作者实际项目工作为背景,介绍算法在C程序中的应用. 1.算法概述 什么是算法呢?先来看一看一些计算机书籍中的定义. 经典书籍<算法导论>(Cormen等著,机械工业出版社)中,作者认为算法是一系

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机          "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力.         在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确

让你提前认识软件开发(16):如何对程序进行优化?

第1部分 重新认识C语言 如何对程序进行优化?            对程序进行优化,是软件开发工程师必然会涉及到的问题.那么为什么要对程序进行优化呢?原因有以下几个:         第一,在原程序基础之上新增.删除或修改了功能,需要改变原程序流程.客户需求随时可能会变化,今天已经实现的功能,说不定明天就要修改或去掉.落实到程序上面,就需要我们随时准备对写好的代码进行修改,而不要奢望写好之后就永远不要动了.         第二,原程序有bug.这类情况出现得非常的频繁,很多软件有1.0.2.

让你提前认识软件开发(21):C程序中的定时器

第1部分 重新认识C语言 C程序中的定时器   [文章摘要]         在实际的C程序中,一个模块执行多个操作是很常见的事情.如果多个操作同时进行,会出现程序效率低下.计算机CPU占用率过高等情况,这时就需要对所有操作的执行顺序作一个合理的安排,这就涉及到定时器的使用.         本文对C程序中的定时器的类型.设置和清除方法等作了详细的介绍,为相关开发工作的开展提供了参考. [关键词]         C程序  定时器  操作  开发   一.定时器的定义及分类         我们

让你提前认识软件开发(22):shell脚本中的文件操作

第1部分 重新认识C语言 shell脚本中的文件操作   [文章摘要]         编写shell脚本时,经常会涉及到对文件的操作,比如从文件中读取一行数据.向文件追加一行数据等.完成文件读写操作的方法有很多,了解各种命令下文件操作的执行情况,有助于开发人员在不同使用场景下选择合适的命令.        本文以实际的shell脚本为例,介绍了对文件进行操作的不同方法,为相关开发工作提供了参考. [关键词]        shell  文件操作  读写  效率   一.概述         在