C语言深入学习 --- 8.实用调试技巧

小明 2025-05-09 01:35:34 7

文章目录

    • 第八章实用调试技巧
      • 1.什么是bug?
      • 2.什么是调试?有多重要?
        • 2.1调试是什么?
        • 2.2调试的基本步骤
        • 3.Debug和Release的介绍
        • 4.Windows环境调试介绍
          • 4.1调试环境的准备
          • 4.2快捷键
          • 4.3调试时查看程序当前信息
            • 4.3.1查看临时变量的值
            • 4.3.2查看内存的信息
            • 4.3.3查看调用堆栈
            • 4.3.4查看汇编信息
            • 4.3.5查看寄存器的信息
            • 5.调试的实例
              • 5.1实例1
              • 5.2实例2
              • 6.如何写出好的(易于调试)代码?
                • 6.1好的代码:
                • 6.2示范
                • 6.3const作用
                • 6.4 assert作用
                • 7.编程中常见的错误
                  • 7.1编译型错误
                  • 7.2链接型错误
                  • 7.3运行时错误
                  • 练习:
                  • 配套���习:

                    第八章实用调试技巧

                    本章着重讲解以下几个内容:

                    1.什么是bug?

                    2.什么是调试?调试有多重要?

                    3.debug和release的介绍。

                    4.Windows环境调试介绍。

                    5.调试的实例

                    6.如何写出好的代码。

                    7.编程中常见的错误。

                    1.什么是bug?

                    软件缺陷 (Defect),常常又被叫做Bug。所谓 软件缺陷 ,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。 缺陷 的存在会导致 软件 产品在某种程度上不能满足用户的需要。

                    2.什么是调试?有多重要?

                    2.1调试是什么?

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

                    2.2调试的基本步骤
                    • 发现程序存在的错误

                    • 以隔离、消除等方法对错误进行相应的定位

                    • 确定产生错误的原因

                    • 提出改正错误的解决措施

                    • 对程序错误进行改正,重新进行测试

                      3.Debug和Release的介绍

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

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

                      我们所说的调试就是在Debug版本的环境中,找代码潜在的问题的一个过程。

                      #include 
                      int main()
                      {
                          int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
                          int i = 0;
                          for (i = 0; i 
                              arr[i] =  0 ;
                              printf("Hello\n");
                          }
                          return 0;
                      }
                      
                      pdebug模式去编译,程序结果为死循环。/p prelease模式去编译,程序没有死循环。/p p它们有什么区别?/p p其实是由于优化导致的。/p p变量在内存中开辟空间的顺序发生变化,影响到程序执行后的结果。/p h44.Windows环境调试介绍/h4 h54.1调试环境的准备/h5 p在环境中选择debug选项,才能使代码正常的调试。/p h54.2快捷键/h5 p比较常用的快捷键:/p pF5/p blockquote p启动调试,经常用来直接跳到下一个断点处/p /blockquote pF9/p blockquote p创建断点和取消断点/p p断点的重要作用就是可以在程序任意位置设置断点/p p可以使程序员在想要的位置停止执行,一步步执行下去/p /blockquote pF10/p blockquote p逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。/p /blockquote pF11/p blockquote p逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。/p /blockquote pCtrl+F5/p blockquote p开始执行不调试,如果想让程序直接运行而不调试就可直接使用。/p /blockquote pVS中常用的快捷键_vs快捷键_MrLisky的博客-CSDN博客/p h54.3调试时查看程序当前信息/h5 h64.3.1查看临时变量的值/h6 p调试->窗口->监视
                      4.3.2查看内存的信息

                      调试->窗口->内存

                      4.3.3查看调用堆栈

                      调试->窗口->调用堆栈

                      4.3.4查看汇编信息

                      调试->窗口->反汇编

                      4.3.5查看寄存器的信息

                      调试->窗口->寄存器

                      5.调试的实例

                      5.1实例1

                      求1!+ 2!+ 3!+ 4!…+ n!;

                      #include 
                      int main()
                      {
                          int n = 0;
                          int i = 0;
                          int j = 0;
                          int sum = 0;
                          int ret = 1;
                          scanf("%d",&n);
                          for (i = 1;i 
                              // ret = 1;
                              for (j = 1;j 
                                  ret *= j;
                              }
                              sum += ret;
                          }
                          printf("sum=%d\n",sum);
                          return 0;
                      }
                      
                          int i = 0;
                          int arr[10] = { 0 };
                          for (i = 0; i 
                              arr[i] = 0;
                              printf("Hello\n");
                          }
                          return 0;
                      }
                      
                          assert(destination != NULL);  //断言
                          assert(source != NULL);
                          char* ret = destination;
                          while (*destination++ = *source++)
                          {
                              ;
                          }
                          return ret;  //返回目标空间的起始地址
                      }
                      int main()
                      {
                          char arr1[] = "HHHHHello";
                          char arr2[] = "World!";
                          printf("%s\n", MyStrcpy(arr1, arr2));
                          return 0;
                      }
                      
                          int a = 10;
                          int b = 20;
                          int* p = &a;
                          *p = 20;
                          p = &b;
                      }
                      void test2()
                      {
                          int a = 10;
                          int b = 20;
                          const int* p = &a;
                          *p = 20;
                          p = &b;
                      }
                      void test3()
                      {
                          int a = 10;
                          int b = 20;
                          int* const p = &a;
                          *p = 20;
                          p = &b;
                      }
                      int main()
                      {
                          //无const
                          test1();
                          //const在*左边
                          test2();
                          //const在*右边
                          test3();
                      }
                      
                          assert(destination != NULL);  //断言
                          assert(source != NULL);
                          char* ret = destination;
                          while (*destination++ = *source++)
                          {
                              ;
                          }
                          return ret;  //返
                      
                          int left = 0;
                          int right = len - 1;
                          while (left 
The End
微信