« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9692051 建立时间:2004年12月20日 |

| |
[编程感想]程序员的debug问题  原创空间, 软件技术, 电脑与网络
邢红瑞 发表于 2007/7/28 14:39:41 |
程序员的主要工作就是制造和修复自己知道的bug,资深的程序员还要查找和修复别人制造的bug。当调试其成为软件开发者的常用工具之后,大家基本就依靠调式工具,设置单点,单步运行,查看程序出错前变量和寄存器的状态,而且调试器一般都有条件断点,可以轻松的调试多线程程序,当然是在windows下。但是过于依赖调试器,会使人的思维变的懒惰,出了问题,程序员不是积极思考程序是如何运行的,而是依靠调试器来看程序运行的流程,在调试器中找到错误。另外的问题就是一些错误不会在调试器中重现,例如客户的计算机没有开发环境等等。这就需要使用其他手段来解决问题。1 内存的检查 主要是依靠一些工具检查内存泄露和资源泄漏,例如NuMega公司的BoundsChecker,主要定位程序在运行时期发生的各种错误。BoundsChecker能检测的错误包括:指针操作和内存、资源泄露错误,比如:对指针变量的错误操作。内存操作方面的错误,内存读、写溢出,使用未初始化的内存,API函数使用版本的不兼容。vc写完的程序用BoundsChecker跑一跑是有好处的。2 Core Dump 在类UNIX系统中,dump文件还叫做core,它记录程序崩溃前操作系统内核的一些状态,包括内存的拷贝,cpu的寄存器信息和函数调用堆栈。core dump可以被调试器处理分析,是非常拥有的工具,不过java调用jni crash的那个log,唯一的价值就是jvm曾经down过。3 logging 记录程序运行中产生的日志,是件不错的事情,好的日志系统可以设置日志的级别,debug, warning, fatal,可以过滤掉某些日志的输出。linux下使用gdb调试线程,是件噩梦,在java中使用满屏,System.out.println是很恶心的事情,打印流需要花费很长的时间,降低程序的运行效率,应该使用log4j,vc中使用trace感觉也不是很好,也有成熟的log工具,而且还可以动态开启,这个比java要好,java的log4j好像只能在spring动态改变级别,别的情况没做成功过。下面给出log4j配置的详细说明 log4j.rootCategory=INFO, stdout , R此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。log4j.appender.stdout=org.apache.log4j.ConsoleAppender定义名为stdout的输出端是哪种类型,可以是 org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) log4j.appender.stdout.layout=org.apache.log4j.PatternLayout此句为定义名为stdout的输出端的layout是哪种类型,可以是org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) log4j.appender.stdout.layout.ConversionPattern= %p [%t] %C.%M(%L) | %m%n使用pattern布局就要指定的打印信息的具体格式ConversionPattern参数如下:%m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。log4j.appender.R=org.apache.log4j.DailyRollingFileAppender定义名为R的输出端的类型为每天产生一个日志文件。log4j.appender.R.File=D:\Tomcat\logs\ebook.log定义名为R的输出端的文件名为D:\Tomcat\logs\ebook.log,可以自行修改。 log4j.logger.com.ebook =DEBUG指定com.ebook包下的所有类的等级为DEBUG。log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN以上这些包的设置可根据项目的实际情况而自行定制。log4j详解1、定义配置文件Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:①、配置根LoggerLogger 负责处理日志记录的大部分操作。 其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, …其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。②、配置日志信息输出目的地 AppenderAppender 负责控制日志记录操作的输出。 Log4j提供的appender有以下几种: org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。 org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender定义一个名为stdout的输出目的地,ConsoleAppender为控制台。③、配置日志信息的格式(布局)LayoutLayout 负责格式化Appender的输出。Log4j提供的layout有以下几种: org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)2、格式化日志信息Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 |
|
» 1 »
|