程序崩溃的调试方法及原因分类

作者 邵发 官网 http://afanihao.cn 本文是 C/C++学习指南(补充篇)- 单步调试 的官方文档,最新版本请在官网获取!

初学C语言/C++程序的编写时,可能经常会遇到程序崩溃的现象。一般来说,程序崩溃是由于内存操作不当引发的。但是具体来讲,由哪些原因可以导致程序崩溃呢?以及当程序崩溃时该如何找到错误的位置呢?本教程即是讲解这个问题。

本文的视频讲解在 C/C++学习指南(补充篇)- 单步调试 的第7,8节课。

一、程序崩溃的定位

先给出一个例子,该代码有致命bug,运行时将使程序崩溃。在VC中输入以下代码:

/////////////// 示例1 ////////////////////
#include <stdio.h>
#include <stdlib.h>
struct Object
{
    int id;
    char name[32];
};
void show(Object* p)
{
    printf("Object [%d, %s] \n", p->id, p->name);
}
void test(int id, const char* name)
{
    Object* obj = NULL;
    show(obj); //<--空指针
}
int main()
{
    int aaa = 9801; // 未使用
    char* str = "127.0.0.1"; // 未使用

    int id = 123;
    const char* name = "shafa";
    test(id, name);
    return 0;
}

* 按CTRL+F5运行
显示程序已崩溃,如下图所示:

这里写图片描述

这种提示意味着代码中存在严重bug,导致了程序崩溃。那么,怎么知道是哪儿出错了呢?

* 按F5启动调试
黄色箭头指向的位置,就是出错的位置。在程序崩溃时,VC会自动地停在导致崩溃的那一行代码上,
这里写图片描述

注意两点:
- 提示的错误为“未处理的异常 0XC000005,读取位置0x00000000时发生访问冲突”。以后凡是看到这种提示,表示错误的原因是“空指针”。
- 在代码编辑器,黄色箭头已经指向了错误的行。

在界面上,点“中断”
这里写图片描述
在界面上,点开“调用堆栈”
这个窗口里可以直接观察到发生错误的时候、函数栈的各层函数的信息。( 如果没有显示这个窗口,可从菜单里 “调试 | 窗口 | 调用堆栈”里打开)
这里写图片描述


  • 25
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值