一.码畜:靠编译器帮自己查语法错误

消灭笔误:编写适合程序员的键盘练习

if (常量==变量或表达式)

使用goto接力超长的if,switch

连续的if还是if elseif

多个条件的组合:精心的排版

多重括号的匹配

条件编译

各种const:不要纠结各种常量了,这个世界上唯一不变的就是变化。用APIWriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!

查看宏展开后的.i文件:VC编译选项加/EP /P(项目、属性、配置属性、C/C++、预处理器、预处理到文件:是,预处理取消显示行号:是),重新编译,查看宏展开后对应的.i文件。gcc加-E

偶遇到莫名其妙的编译错误都是用“每次用/*...*/或#if 0...#endif注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”的方法解决的。

附加包含路径、附加库路径、附加依赖库的设置。

 

二.码农:靠调试器帮自己查逻辑错误

for/while语句后多余的分号

while/do while语句在语义上的歧义

条件断点

消息断点

数据断点

__asm int3或DebugBreak()断点

在内存窗口中观察数据的原始字节形态

Call Stack:崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!

递归函数关注以下几个因素

·退出条件

·参数有哪些

·返回值是什么

·局部变量有哪些

·全局变量有哪些

·何时输出

·会不会导致堆栈溢出

语法糖越甜,编译调试查错越苦!

C++的隐藏调用:单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

任务管理器、VMMap、Process Monitor、Process Explorer、GDI泄露检测工具、……

三.码人:靠写日志帮自己查运营错误

CrashDump或Core的无力。

PDB的无力。

线上Debug的无力。

观察复杂数据的无力。

多线程调试的无力。

调试时序高度依赖代码的无力。

调试万年一遇非法数据的无力。

有时不将“调用函数名字+各参数值,进入函数后各参数值,中间变量值,退出函数前准备返回的值,返回函数到调用处后函数名字+各参数值+返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的,包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行!

 

四.码神:靠冥想和顿悟帮自己查不可再现错误

假死的各种原因:

·控制循环的变量的取值范围有符号/无符号,==/<=

·控制循环的变量没变

·控制循环的变量被外部程序修改

·各种资源泄露

·死锁

·网速变慢或网络资源耗尽或网络时通时断

·权限、UAC、杀毒软件实时防护

·操作系统或软件自动升级

·以为系统时间不可逆

·以为系统时间相关变量不会溢出(GetTickCount()约49.7天就归0了!)

·……

不要企图优雅的结束(因为这是不可能办到的)

而要在烂的不能再烂的摊子上也能重整河山!

转自 http://blog.csdn.net/zhao4zhong1/article/details/53078924 侵删

转载于:https://www.cnblogs.com/12xiaole/p/7570058.html

老司机找bug的心路历程相关推荐

  1. 老司机找BUG指南,赶紧拿走。。

    一.码畜:靠编译器帮自己查语法错误 消灭笔误:编写适合程序员的键盘练习 if (常量==变量或表达式) 使用goto接力超长的if,switch 连续的if还是if elseif 多个条件的组合:精心 ...

  2. 应届毕业生找工作的心路历程

    相信也有很多应届毕业大学生都知道9.10.11月份的重要性,这也关乎着自己以后的未来,本人是一个普通的二本院校的毕业生,就谈谈自己的当时在找工作的心路历程. 1.打击 9月份应该是我受打击最深的一段时 ...

  3. 程序员修复一个bug的心路历程,太形象了

    和你们一样,我也是一个普普通通的前端开发者,在日常工作中,大部分时间不是在写新代码,而是在改代码,或是需求被改了,或是报bug了. 当别人想我们报一个bug,直到我们把bug完整的修复好,整个过程是一 ...

  4. 一个老产品的心路历程

    一个产品经理的经历可以分为三个阶段:无知者无畏.初出茅庐.渐行渐远. 近日,心中一直颇不平静,像如今这样的日子,17年前也曾经历,只不过那时候我还是一个高一的学生,现在回想起来,只记得当初得到了一个漫 ...

  5. AI向程序员老司机学习:从眼神的变化中寻找bug

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 用AI找bug这件事,有人尝试过,结果翻车了.美国网站Yelp的程序员们试图让AI帮自己找bug,岂料AI却删库跑路,最后只能用回滚的办法 ...

  6. 我学习 Java 的历程和体会(写给新手看,欢迎老司机批评和建议,持续更新中)

    我学习 Java 的历程和体会(写给新手看,欢迎老司机批评和建议,持续更新中) 最初写这篇文章的时候,是在今年的 9 月中旬.今天,我想再写写这将近两个多月以来的感受. 在今年的 10 月我来到北京求 ...

  7. 2022考研二战失败找工作心路历程

    2022考研二战失败找工作心路历程 写这篇文章就是记录一下从考研失败到现在,自己的心里变化和自己遭遇的问题.仅仅做个记录. 本人毕业于一所双非,一战在学校随波逐流,边玩边考,后面甚至在宿舍摆烂3个月, ...

  8. 服务器维修找什么机构靠谱,老司机教你怎么选择靠谱的维修店,再也不用担心被坑了!...

    小编一个好基友在国庆节的时候提了辆新车回来,由于是新手司机,爱车各种磕磕碰碰的怎么都避免不了,由于是新车又比较爱护,就隔三差五地跑去维修店给处理下.这问题就来来了,老是神经兮兮地问什么维修店比较靠谱点 ...

  9. python炸了找不到工作怎么办信用卡_没有工作怎么办信用卡 老司机教你这么“干”...

    一份稳定的工作和收入是成功申请信用卡的重要条件之一,但是如果你是自由职业者,又或者刚好你需要办信用卡时没有上班,是不是就不能申请信用卡了呢?其实不然,没有工作怎么办信用卡,看看老司机的经验. 1.以卡 ...

最新文章

  1. dede首页调用文章标题|概述|所在栏目
  2. Xamarin.Forms中为WebView指定数据来源Source
  3. TensorFlow 莫烦视频学习笔记例子二(一)
  4. 怎么把截屏的一部分内容涂掉_观影手帐怎么做?这里有妙招!
  5. Python应用02 Python服务器进化
  6. java递归基础掉用_Java递归基础
  7. scala(10)-----Scala 闭包
  8. 卷积交织/解交织C++程序
  9. predicate 列存储索引扫描_MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!
  10. 基于物理的体积光实现
  11. python function terminated un_python僵尸进程产生的原因
  12. 第十二章 非编码RNA与复杂疾病
  13. 查看正在运行docker容器的启动命令
  14. 迪斯尼计算机动画,迪斯尼经典动画的十大运动规律
  15. 处理火狐浏览器播放哔哩哔哩(BiliBili)视频时无法倍速问题
  16. 2020年鼠年正月十二 淡然面对
  17. word文档任意位置开始插入页码
  18. 对象含有与成员函数不兼容的类型限定符
  19. linux下使用tc做流量限速
  20. C语言写货郎问题(贪心算法)

热门文章

  1. 【opencv学习】Fast算法进行角点检测
  2. 《scikit-learn》数据预处理与特征工程(一)数据归一化
  3. 图像语义分割 -- UNET++
  4. Baum-WELCH和vertibe解码算法
  5. 视频转图片序列、图像序列转视频等处理(mmcv vs. opencv)
  6. leetcode - 5. 最长回文子串
  7. pytorch —— 图像预处理模块(Transforms)
  8. 2018 A Sparse Topic Model for Extracting Aspect-Specific Summaries from Online Reviews 稀疏主题模型学习笔记
  9. 豆瓣网络爬虫-java网络爬虫[验证码模拟登陆]详细介绍
  10. html请求接口_软件测试学习教程——LoadRunner实现接口测试