C语言初阶——8实用调试技巧

1.Debug和Release的介绍。

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。

在这里插入图片描述

2. VS调试的时候查看程序当前信息

2.0 开始调试

在想要调试的代码之前单击一下,就会有个小红点,这就是打断点,先给程序打断点
然后在工具栏有一个【调试】单击出来点【开始调试】 ,快捷键F5就是开始调试
在这里插入图片描述

2.1 查看临时变量的值

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

  1. 给要调试的函数打断点
  2. 点击【调试】,然后点击【窗口】
  3. 点击【局部变量】这个是随程序一起显示局部变量
  4. 点击【监视】这个可以添加自己想看的变量的值
    在这里插入图片描述

2.2 查看内存信息

  1. 给要调试的函数打断点
  2. 点击【调试】,然后点击【窗口】
  3. 点击【内存】
  4. 点击【内存1】这四个可以自己随意选

在这里插入图片描述

在这里插入图片描述

2.3 查看调用堆栈

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置。

  1. 给要调试的函数打断点
  2. 点击【调试】,然后点击【窗口】
  3. 点击调用堆栈
  4. 可以看到函数是被谁调用的
    在这里插入图片描述

在这里插入图片描述

2.4 查看汇编信息

在调试开始之后,有两种方式转到汇编:

(1)第一种方式:开始调试之后,在代码旁边,直接右击鼠标,选择【转到反汇编】:
在这里插入图片描述
在这里插入图片描述

(2)第二种方式:

1.开始调试之后
2. 点击【调试】,然后点击【窗口】
3. 点击【反汇编】
在这里插入图片描述

在这里插入图片描述

2.5 查看寄存器信息

1.开始调试之后
2. 点击【调试】,然后点击【窗口】
3. 点击【寄存器】
在这里插入图片描述

在这里插入图片描述

3. 一些调试的实例

3.1 实例1

实现代码:求 1!+2!+3! …+ n! ;不考虑溢出。

int main()
{
 int i = 0;
 int sum = 0;//保存最终结果
 int n = 0;
 int ret = 1;//保存n的阶乘
 scanf("%d", &n);
 for(i=1; i<=n; i++)
 {
 int j = 0;
 for(j=1; j<=i; j++)
 {
 ret *= j;
 }
 sum += ret;
 }
 printf("%d\n", sum);
 return 0;
}

这时候我们如果3,期待输出9,但实际输出的是15。
在这里插入图片描述
调试定位问题,发现是我们没有给ret重新赋初值,
在这里插入图片描述

3.2 示例2

int main()
{
    int i = 0;
    int arr[10] = {0};
    for(i=0; i<=12; i++)
   {
        arr[i] = 0;
        printf("hehe\n");
   }
    return 0;
}

研究程序奔溃的原因。

在这里插入图片描述

思考原因分析
在这里插入图片描述

调试验证下 代码点开调试,打开反汇编页面,输入我们想观察的变量,然后把打开内存看下i的地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 如何写出好(易于调试)的代码。

4.1 优秀的代码:

  1. 代码运行正常
  2. bug很少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全
    常见的coding技巧:
  8. 使用assert
  9. 尽量使用const
  10. 养成良好的编码风格
  11. 添加必要的注释
  12. 避免编码的陷阱。

4.2 库函数strcpy

/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
*       Copies the string src into the spot specified by
*       dest; assumes enough room.
*
*Entry:
*       char * dst - string over which "src" is to be copied
*       const char * src - string to be copied over "dst"
*
*Exit:
*       The address of "dst"
*
*Exceptions:
*******************************************************************************/
char * strcpy(char * dst, const char * src)
{
        char * cp = dst;
 assert(dst && src);
 
        while( *cp++ = *src++ )
               ;     /* Copy src over dst */
        return( dst );
}

博主写了一篇慢慢走向这个优秀代码的博客,欢迎一起学习
strcpy的模拟实现

4.3 const的作用

const修饰指针变量的时候:

  1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改
    变。但是指针变量本身的内容可变。
  2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指
    针指向的内容,可以通过指针改变。

5. 编程常见的错误

5.1 编译型错误

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

5.2 链接型错误

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

5.3 运行时错误

需要借助调试,逐步定位问题。这个是最难解决的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值