万收网logo 临沂地区24小时上门回收电话:18264909999

新闻详情

输出语句例如print cout 是最好的调试方法吗


2020-01-11 22:08

一句话回答的话:看情况;有时候可能是最好的。
 
在实践中,程序的调试方法并不局限,一个有经验的程序员会选择当前条件下最为善巧方便的办法。
 
现在 IDE 的调试功能很强大;断点,条件断点,数据断点,变量显示,内存显示,就能解决多数问题了。但这些功能并不总是可用的。例如,在 release 版本中,程序编译时开了各种优化,调试起来就难了。例如一些函数被 inline 了,一些操作被优化掉了,顺序重排了等等;源码到指令没有了对应关系。
 
一些 bug 到了用户的设备上才偶尔发生,不易复现;还有一些 bug 要求数据集很大,无法用调试器去人力调试。这里通常用日志,也就是设法把程序的事件历程写在磁盘上;出问题之后,就可以在日志里面寻找原因。printf,cout 或者 cerr 这些标准流可以重定位到磁盘文件上的,也可以直接用文件流,这就是最基础的日志系统。对于服务器程序来说这几乎是必不可少的,日志往往同时写到屏幕上和磁盘里以便观测和追踪。有时候,我们甚至还要写专门的工具去分析日志、图形化日志数据等等。对于多线程程序来说,使用标准流需要注意竞争问题,这可以通过同步访问来解决。另外,各语言一般都有高性能、支持多线程的日志库,也是很好的选择。
 
其实对于调试来说,尤其是条件苛刻的时候,任何能利用的东西都可以拿来用:例如抛异常让程序崩溃,弹对话框,通过网络发送日志,让某个指示灯变成红色,发送一条短信,弹出光驱托盘,用扬声器发出不同频率的 beep 声等等。只要能把问题反映出来方便我们排查问题则都是可行的。
 
对于特定问题,还有特定的工具去解决。例如针对多线程问题的分析器,针对内存问题的分析器,针对 3D 渲染问题的调试器。甚至针对硬件还有专门的、昂贵的调试设备。
 
所以什么是最好的调试方法呢?
 
 
当然,尽量少写 bug,用断言、单元测试等把它消灭在萌芽状态是最好。这也是调试的一部分。所以程序不是写出来的,而是调试出来的。

  • 上一篇:为什么有人会排斥用苹果电脑?
  • 下一篇:计算机能不能真正意义上存储一个无理数?
  •