• Visual Studio2022编译器实用调试技巧


    目录

    1.什么是bug

    2.调试是什么?

    3.debug和release的介绍

    4.windows环境调试介绍

    4.1 调试环境的准备

    4.2 学会快捷键

    4.3 调试的时候查看程序当前信息

    4.4 查看内存信息

    5.如果写出好(易于调试)的代码

    7.编程常见的错误


    1.什么是bug

    这是Grace Hopper在1947年在Markll机器运行程序时发现的第一个程序"bug",被贴在她的本子上了。它真的是个虫子。这只夹扁的小飞蛾在MarkⅡ计算机的继电器触点里,它"卡"住了机器的运行,导致运行出错,是第一个计算机程序错误。后来人们习惯性的把程序出的问题称为Bug,把排除程序故障叫做Debug(除虫)。
     

    2.调试是什么?

    我们再写代码时,不要只会复制,粘贴。对于程序出现的问题,我们要通过调试来解决,不能如下图:

     拒绝-迷信式调试! ! ! !
    调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

    调试的基本步骤·发现程序错误的存在:

    1. 以隔离、消除等方式对错误进行定位
    2. 确定错误产生的原因
    3. 提出纠正错误的解决办法
    4. 对程序错误予以改正,重新测试
       

    3.debug和release的介绍

    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

    Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

    1. #include
    2. int main()
    3. {
    4. char *p = "hello xilanhua";
    5. printf("%s\n",p);
    6. return 0;
    7. }

    上述代码在Debug环境的结果展示

     上述代码在Release环境的结果展示 

     可以发现Release版本下可执行文件比Debug版本下的可执行文件小了很多,说明Release版本做了优化。

    看下面这段代码:

    1. #include
    2. int main()
    3. {
    4. int i = 0;
    5. int arr[10] = { 0 };
    6. for (i = 0; i <= 12; i++)
    7. {
    8. arr[i] = 0;
    9. printf("hehe\n");
    10. }
    11. return 0;
    12. }

    在Debug模式下,x86{32位)环境下,会出现死循环。是因为:

    i和数组arr都是局部变量,是在栈区创建的,栈区内存使用特点是先使用高地址空间,而数组又是从低地址往高地址排列,vs编译器变量之间空两个字节,所以当循环执行到arr[12]时会把i的值的值改为0,造成死循环。

     如果是debug模式去编译,程序的结果是死循环。如果是release模式去编译,程序没有死循环。那他们之间有什么区别呢?就是因为优化导致的。
     

    4.windows环境调试介绍

    注:Linux开发环境调试工具式gdb,后期课程会讲

    4.1 调试环境的准备

     在环境中选择Debug选项,才能使代码正常调试

    4.2 学会快捷键

    最常使用的几个快捷键︰
    F5

    启动调试,经常用来直接调到下一个断点处。没有断点会让程序运行完。

    F9

    创建断点和取消断点断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

    F10

    逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

    F11

    逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最长用的)。

    CTRL+ F5

    开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

    4.3 调试的时候查看程序当前信息

    查看临时变量的值:

    调试开始后,用于观察变量的值

     

    4.4 查看内存信息

    在调试开始之后开始观察内存信息

     

    多多动手,尝试调试,才能有进步

    —定要熟练掌握调试技巧。
    初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
    我们所讲的都是一些简单的调试。以后可能会出现很复杂调试场景∶多线程程序的调试等。·多多使用快捷键,提升效率。

    5.如果写出好(易于调试)的代码

    优秀的代码∶

    • 1.代码运行正常
    • 2.bug很少
    • 3.效率高
    • 4.可读性高
    • 5.可维护性高
    • 6.注释清晰
    • 7.文档齐全

    常见的coding技巧∶

    • 1.使用assert 断言,下面会使用
    • 2.尽量使用const 
    • 3.养成良好的编码风格
    • 4.添加必要的注释
    • 5.避免编码的陷阱。示范:

    const的用法

    const修饰指针的时候
    当const 放在*的左边,限制的指针指向的内容,不能通过指针变量改变指针指向的内容,但是指针变量的本身是可以改变的
    当const 放在*的右边,限制的指针变量本身,指针变量的本身是不能改变的,但是指针指向的内容是可以通过指针来改变的

    1. #include
    2. int main()
    3. {
    4. int m = 10;
    5. //const 可以修饰指针
    6. int n = 100;
    7. const int* p = &m;//*p的值不可改变
    8. //int* const p = &m; //p的指向不能改变
    9. //*p = 0;
    10. //p = &n;
    11. return 0;
    12. }


    模拟实现库函数: strcpy。示例:

    1. #include
    2. #include
    3. #include//assert 断言
    4. void my_strcpy(char* dest, const char* src)//const 使为了防止*src被修改
    5. {
    6. //断言
    7. assert(dest != NULL);//条件为假报错,会直接提示是这里出错
    8. assert(src != NULL);
    9. char* ret = dest;
    10. while (*src != '\0')
    11. {
    12. *dest = *src;
    13. dest++;
    14. src++;
    15. }
    16. *dest = *src;//拷贝 \0
    17. //while (*dest++ = *src++);//等同于上面代码
    18. return ret;
    19. }
    20. int main()
    21. {
    22. char arr1[] = "hello world";
    23. char arr2[20] = "*************";
    24. //会把原字符串的'\0'拷贝过来
    25. my_strcpy(arr2, arr1);//返回的是目的地的地址
    26. printf("%s\n", arr2);
    27. printf("%s\n", strcpy(arr2, arr1));//链式访问
    28. return 0;
    29. }

    7.编程常见的错误

    常见的错误分类:

    编译型错误

    直接看错误提示信息,双击可以定位,解决问题。或者凭借经验就可以搞定。相对来说简单。

    链接型错误

    link 链接期间发生错误。看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。

    运行时错误

    借助调试,逐步定位问题。最难搞。

    最后,今天是第一次恋爱和平分手的日子,为期78天,祝自己以后每天都快乐。

    本篇结束

     

  • 相关阅读:
    TEB (Timed Elastic Band)
    49数码论坛系统设计与实现
    使用Spark清洗统计业务数据并保存到数据库中
    Mockaroo - 在线生成测试用例利器
    多御安全浏览器新版下载 | 功能优秀性能出众
    ES6中set、map、DOM classList的基础用法
    设计模式之原型模式
    计算机毕业设计SSM大学生网上书店【附源码数据库】
    VSCode编写OpenCV
    Nginx两个反向代理实例
  • 原文地址:https://blog.csdn.net/qq_72916130/article/details/130894578