C语言的 debug,log,try的区别和用法

哈。好久没有水技术贴了。这里讨论一下C语言的 debug,log,try的区别和用法。

log大家都知道,我先简单重复一下作用,log的目的是对程序运行态下,运行状态的一个记录。

debug是什么?debug就是debug哈。我仍然坚持一个原则,其他C 程序员是否坚持和我没关系。即,不使用IDE。不使用DBG。

不使用IDE的主要原因是没有好的IDE,同时很多debug的策略技巧,IDE也没有办法实际提供。

不使用DBG的原因是,DBG真正能有效快速的DEBUG的场合或情况很少。

debug的模块应该能完成以下几个事情:

1、断言,C标准中有 assert.h这个头文件,对应gcc也有 _assert。断言的作用在于当一个逻辑不符合预期时,给出提示。比较悲催的是,很多库的断言,会调用exit。程序会直接退出。断言有另一个重要功能,使用了预编译的 __FILE__ ,__LINE__,这个作用可以使得在编译时,获取当前位置和当前文件名。由此,断言可以快速准确的找到当前的不合预期的位置。

2、条件判断的信息摘录。这个和LOG有很大区别。

通过断言,我们只能知道错的位置,但不能知道错的原因和机理。由此需要在断言发生前,对一些数据进行必要的输出摘录。这不属于LOG的是。如果你坚持,哈,那你慢慢享受工程操作中的“纠结”吧。

条件判断的信息摘录基本情况为两种,一个是状态判断。例如指定的内存,被改写,或被修改的超过范围。另一个是基数判断。例如我们一个大函数,循环到6543次时出错。你从头开始摘要一些变量的值进行保存显然没有必要,更何况你要摘要很多相关变量的情况下,输出内容会非常多,即影响了后期输出信息的识别,也影响了程序的运行速度。

基于上述两个功能的debug模块,可以说基本上对于C的高级语言部分,已经无敌了。但有些非高级语言可描述的问题就无能为力。例如,我们想判断一个指定的地址被写操作了,或者被读操作了。包括寄存器。这最软的,也需要对应硬件系统的SIMU进行处理。此处暂且不谈。

try,其实也就是等同其他高级语言的try catch。

try和debug,不一样。是属于运行态下的代码,不能将try理解为我在回避一个逻辑错误。而是得看作,try在为同步提供服务(抽象的理解,别和我鬼扯进程同步)。由于其他模块的状态没有到位,资源没有到位,引发的两个模块的逻辑不匹配,此时使用try。

因此,使用try的地方,应该是受外部状态影响,导致内部存在选择性执行的地方。没有try,使用其他方式也能完成,但try可以通过长跳转和重载(不的是面向对象概念)signal 中断相应函数,来实现。这对一个模块处于运行时,在外部同步状态不正确下(资源未到位等),对于保持,不死机,不退出,不服务,三不原则很有帮助。

需要补充的是,log和debug虽然都有信息采集,但debug只是为了抓BUG。这类判断验证逻辑并不是模块需要的,例如无原则的判断入口函数的指针是否为0或超过该指针应该对应的数组地址空间范围等。LOG是记录模块运行状态的,这是模块对外的一个展示,属于模块的必要组成。

debug原则上,应该尽可能的仅使用.h文件进行记录描述。而对于release版本,通过NDEBUG的宏,在预编译时对debug代码进行彻底移除。

LOG完全是个模块。其他模块使用LOG模块进行处理。

try,可以看作利用了setjmp.h ,signal.h的标准,进行的一个封装。属于基本库。即不独立成模块,也不被完全嵌入到其他C文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值