• 老司机找bug的十年心路历程


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

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

    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:崩溃的时候在弹出的对话框按相应button进入调试,按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了!

    ·……

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

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

  • 相关阅读:
    【编程基础】const与#define的区别
    【Unity3D】模仿制作“神庙逃亡”吃金币后金币飞出屏幕效果
    【基础数学】素数判定、素数打表
    【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法
    【基础数学】质数,约数,分解质因数,GCD,LCM
    【NYOJ-35】表达式求值——简单栈练习
    【UVa-679】小球下落——二叉树的编号
    【UVa-442】矩阵链乘——简单栈练习
    【UVa-514】铁轨——栈的学习
    gitignore git提交忽略文件
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8623677.html
Copyright © 2020-2023  润新知