前言

对于编写好的程序,或多或少可能存在bug和错误,简单语法上的问题编译器能够直接给出提示,而对于逻辑上出现的错误,编译器是不能直接发现的。所以就有了debug调试的过程。


正文

为了方便调试,我们希望在编程风格上

  1. 模块化
  2. 使用有意义的变量名和函数名
  3. 控制缩进,首尾呼应
  4. 良好的注释习惯
1
2
3
4
5
6
7
inculde 《stido.h》

int mian(){
print("hello world");

retrunt 0;
}

像这种。。字面上的错误都算是语法问题,编译器一下子就能找到问题,人眼也能看到。。这种其实就不算什么bug

而逻辑错误:

1
2
3
4
5
int ch[][3]={
{1,2,3},
{4,5,7},
{8,9,10},
}

这一种由程序生成后,看到其实不是按照预期结果从1-9的,在其中一个地方发生了什么导致跳过了,这种问题他不影响运行,但是与我们预期结果不符合,就可以说是一种逻辑错误。


模块化

1
2
3
int add(int a,int b){
return a+b;
}

一些重复性的功能用函数解决,这就是模块化,他可以减少重复操作导致的代码量。


有意义的名称

1
2
int a,b,c;
int num,sum,add;

做测试可能随便一点,但是如果看到这个变量名或者函数名我就能猜到它是干什么的。那么对于团队协作会提升很大效率。


缩进

1
2
3
if(true)
if(true)
else

像这种情况,if和else不对齐,或者乱对齐,无法准确的表达出意思就会让人很反感。
如果说else的内容是要给第二个if对齐,你这样写就很不合理。


注释

1
int add(int x,int b); //这是一个求两个数之和的函数

虽然这个函数名比较简单通过形参也知道大概就是求和的,那么增加一行注释会有更直观的感想。


调试器

如果用过mingw,应该知道有gcc/g++ 和调试工具 gdb
用过黑苹果 所以知道一个 clang,调试器是啥不知道,就观望了一下
然后vs2019这种ide 用的都是微软自己弄的,应该也是叫msvcdbg吧好像。

原理都差不多,应该是在基础上增加了什么功能,毕竟最常见就是打断点分析

打完断点后运行的时候程序就会停在断点处,这个时候ide就会多了值和内存什么的分析。

逐语句就是单步递增往下走。他进入函数之后也是一步步调试

而逐过程则稍微有点区别

它的作用就是跑到函数的时候不进去单步走直接执行完这个函数

还有个跳出
顾名思义也就是跳出某个函数

且断点不只是在程序跑之前设置,跑的时候也可以设置。

反汇编就很直接,可以从打断点的语句后面右击直接转到反汇编

也可以调试-窗口-反汇编,都行怎么习惯怎么来。
反汇编就更偏底层了,正常的调试可能还是源文件页面调。

感觉这个调试不好讲,有时间还是看视频理解吧


其他调试器

这些个可能都是干坏事用的,比如

  1. 0llyDbg
  2. x96Dbg
  3. WinDbg

比如~歪瓜,会检索一些属性之类的。


ifdef

预处理指令可以根据定义宏去考虑要不要输出调试信息。
跟之前用法类似,就不演示了。


结语

debug不好操作,估计还是得录视频会好操作表示点。