(三十二)单步调试技术

作者 : 开心源码 本文共1053个字,预计阅读时间需要3分钟 发布时间: 2022-05-12 共165人阅读

编译错误与运行错误

  • 编译错误:编译器提醒的错误,低级错误,语法有错,根本无法生成exe文件

  • 运行错误:程序运行的结果与预期不一致,说明程序不对,存在bug,需要修改

    一般情况下,能复现的错误都是可以处理的

单步调试

单步调试就是在要调试的代码段首行加断点,走一步看一下结果,边走边观察,直到发现有哪一步走错了

在vs环境下,断点F9,单步F10,(F10是逐过程stepover,跳过函数具体执行,F11是逐语句stepinto,可以进入函数)开始调试F5,再按F5跳到下一个断点,若无下一个断点则退出调试。黄色箭头表示即将执行这条语句

//求和#include<stdio.h>int sum(int* buf,int n){    int total = 0;    for(int i=0;i<total;i++)    {        total+=buf[i];    }    return total;}int main(){    int buf[64];    for(int i=0;i<64;i++)    {        buf[i]=i;    }    int result = sum(buf,64);    printf("%d\n",result);    return 0;}

程序结果是零,说明程序有错。利用单步调试发现sum函数写错了

监视窗口可以单独只查看某个变量的情况。内存窗口输入p可以看到指针p对应的内存,观看变量a的内存时输入&a。a=0x12345678对应的内存为78 56 34 12共四个字节。

程序崩溃的起因分类

  • 一个变量未初化、未赋值,就读取它的值。( 这属于逻辑问题,往往是粗心大意的导致的 )

  • 函数栈溢出(1)定义了一个体积太大的局部变量(2)函数嵌套调用,层次过深(如无穷递归)

    int buf[1024*1024*16]; //这个变量体积太大,应该用malloc或者new来动态分配内存
    //无穷的递归调用#include <stdio.h>#include <stdlib.h>void a();void b();void a(){  printf("Calling a() ...\n");  b();}void b(){  printf("Calling b() ...\n");  a();}int main(){  a();  return 0;}
  • 数组越界访问

  • 指针的目标对象不可用,为空指针,野指针(指针未赋值,已经free/delete了却还要用,不恰当的指针强制转换要求)

//野指针:不恰当的强制转换#include <stdio.h>int main(){  int a = 10;  double* p = (double*) &a;  *p = 123.345; // 程序崩溃  return 0;}

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » (三十二)单步调试技术

发表回复