注册 登录
Office中国论坛/Access中国论坛 返回首页

ganlinlao的个人空间 http://www.office-cn.net/?230471 [收藏] [复制] [分享] [RSS]

日志

freebasic菜鸟初学Freebasic基础教程十三:代码调试及导出函数

热度 1已有 5190 次阅读2017-5-17 21:26 |个人分类:FreeBasic| FreeBasic基础, Freebasic入门, FreeBasic教程, FreeBasic基础, Freebasic入门, FreeBasic教程, FreeBasic基础, Freebasic入门, FreeBasic教程

        调试功能一般是编辑器提供的,很遗憾的是Freebasic目前最成熟的编辑器是FBEdit,这个编辑器提供单步调试功能,输出窗口,但调试功能跟vb6和vs比较,还是差得比较远。freebasic论坛上还有一个FBdebugger,这款debugger风格还是接近c/c++风格,支持debug版exe运行调试,支持多线程调试。而我使用WinFBE,甚至连调试功能还没有提供。总体来说,Freebasic各个编辑器的调试功能都比较弱。
        几乎适用于c/c++的调试工具,也同样适用在Freebasic上。如强大微软的winDBG,小巧的dbgView,Gcc官方的DBG.exe,具体使用教程,可以搜索一下。
        接下来,我们来看看网络上总结的代码调试技巧
 ======================================================       

在调试程序时,输出调试信息是一种普遍、有效的方法。输出调试信息一般有以下五种方法:

       方法一:直接使用屏幕打印函数print。

该方法直接在需要输出调试信息的位置使用函数printf输出相应的调试信息,以及某些关键变量的值。

      方法二:自定义调试函数debug。

为了避免方法一的缺点,可以利用条件编译技术,自定义调试函数debug。当程序正式发布的编译时取消宏定义__DEBUG__,在正式发布的程序中就不会输出调试信息。若又出现bug,只要重新在编译程序时定义宏__DEBUG__即可恢复原来的调试信息输出。可以在编写程序时就有目的事先插入些调试语句,这将有益于调试程序。另外,可以根据需要编写函数debug,将调试信息输出到除屏幕以外的其它地方,如文件或syslog服务器等。 

该方法的缺点是(1)调试信息要么全部输出,要么全不输出;(2)要重新输出调试信息时需要重新编译程序。

      方法三:含调试等级的自定义调试函数debug。

可以继续改进方法,避免方法二中的缺点。我们可以根据调试信息的细节程度,将调试信息分成不同的等级。调试信息的等级必须大于0,若调试信息细节程度越高,则等级越高。在输出调试信息时,若调试等级高于调试信息等级才输出调试信息,否则忽略该调试信息。当调试等级为0时,则不输出任何调试信息。

这样,在正式发布版中包含调试信息也无伤大雅了,因为只需将调试等级配置为0,将不会出现任何调试信息。

该方法的缺点是效率不太高,因为不管调试信息是否需要输出,都会进行一次函数调用。若不需要输出调试信息,这次函数调用就多余了。

       方法四:调试等级的判断放在自定义调试函数debug之外。

为了减少不必要的函数调用,可以用宏定义将调试等级的判断放在函数debug之外
       调试等级的判断放在自定义调试函数debug之外

这种方法对于不需要输出的高等级的调试信息操作来说,仅仅多了个两个整数之间的大小判断。在正式的程序运行时,效率是有所提高的。

但这种调试信息输出的方法依然不够完美。对于一个大项目,一般分为若干个模块,bug将会定位到某个或某几个模块。若整个项目的调试信息都输出,信息量将会非常大,也容易干扰调试人员的思维。这时,我们需要的是只输出我们关心的那些模块的调试信息,但该方法并不能达到我们的要求。它只能根据调试等级输出信息,对于同一调试等级的信息要么全输出,要么全不输出。

        方法五:根据不同的功能模块分别定义不同的调试等级。

在squid[1]中,定义了以下的功能模块调试等级变量和调试函数:

 int debugLevels[MAX_DEBUG_SECTIONS];
 #define debug(SECTION, LEVEL) /
         ((_db_level = (LEVEL)) > debugLevels[SECTION]) ? (void) 0 : _db_print

然后在程序中如下使用它:

     debug(17, 3) ("fwdStateFree: %p/n", fwdState);

上述调试函数很灵活,可以在不同的模块中定义有不同的调试等级,当需要调试某功能时,只需将该模块的调试等级定义为相应的等级,就可输出需要的调试信息。

========================================================    
       这是一段来自afx库的带调试功能的宏定义,写得蛮规范的,我们可以借鉴
       #ifndef _CWSTR_DEBUG_
      #define _CWSTR_DEBUG_ 0
     #endif
    #ifndef _CWSTR_DP_
     #define _CWSTR_DP_ 1
           #MACRO CWSTR_DP(st)
            #IF (_CWSTR_DEBUG_ = 1)
            OutputDebugStringW(st)     'outPutDebugString()是微软使用的调试代码,可以被任何调试工具捕获得到。
           #ENDIF
          #ENDMACRO
    #endif

发表评论 评论 (1 个评论)

回复 admin 2017-5-21 19:19
强!!,赞!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-25 19:22 , Processed in 0.060812 second(s), 18 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部