【编译器角度】debug
前言
对于编写好的程序,或多或少可能存在bug和错误,简单语法上的问题编译器能够直接给出提示,而对于逻辑上出现的错误,编译器是不能直接发现的。所以就有了debug调试的过程。
正文
为了方便调试,我们希望在编程风格上
- 模块化
- 使用有意义的变量名和函数名
- 控制缩进,首尾呼应
- 良好的注释习惯
1 | inculde 《stido.h》 |
像这种。。字面上的错误都算是语法问题,编译器一下子就能找到问题,人眼也能看到。。这种其实就不算什么bug
而逻辑错误:
1 | int ch[][3]={ |
这一种由程序生成后,看到其实不是按照预期结果从1-9的,在其中一个地方发生了什么导致跳过了,这种问题他不影响运行,但是与我们预期结果不符合,就可以说是一种逻辑错误。
模块化
1 | int add(int a,int b){ |
一些重复性的功能用函数解决,这就是模块化,他可以减少重复操作导致的代码量。
有意义的名称
1 | int a,b,c; |
做测试可能随便一点,但是如果看到这个变量名或者函数名我就能猜到它是干什么的。那么对于团队协作会提升很大效率。
缩进
1 | if(true) |
像这种情况,if和else不对齐,或者乱对齐,无法准确的表达出意思就会让人很反感。
如果说else的内容是要给第二个if对齐,你这样写就很不合理。
注释
1 | int add(int x,int b); //这是一个求两个数之和的函数 |
虽然这个函数名比较简单通过形参也知道大概就是求和的,那么增加一行注释会有更直观的感想。
调试器
如果用过mingw,应该知道有gcc/g++ 和调试工具 gdb
用过黑苹果 所以知道一个 clang,调试器是啥不知道,就观望了一下
然后vs2019这种ide 用的都是微软自己弄的,应该也是叫msvcdbg吧好像。
原理都差不多,应该是在基础上增加了什么功能,毕竟最常见就是打断点分析
打完断点后运行的时候程序就会停在断点处,这个时候ide就会多了值和内存什么的分析。
逐语句就是单步递增往下走。他进入函数之后也是一步步调试
而逐过程则稍微有点区别
它的作用就是跑到函数的时候不进去单步走直接执行完这个函数
还有个跳出
顾名思义也就是跳出某个函数
且断点不只是在程序跑之前设置,跑的时候也可以设置。
反汇编就很直接,可以从打断点的语句后面右击直接转到反汇编
也可以调试-窗口-反汇编,都行怎么习惯怎么来。
反汇编就更偏底层了,正常的调试可能还是源文件页面调。
感觉这个调试不好讲,有时间还是看视频理解吧
其他调试器
这些个可能都是干坏事用的,比如
- 0llyDbg
- x96Dbg
- WinDbg
比如~歪瓜,会检索一些属性之类的。
ifdef
预处理指令可以根据定义宏去考虑要不要输出调试信息。
跟之前用法类似,就不演示了。
结语
debug不好操作,估计还是得录视频会好操作表示点。