程序崩溃的原因及处理方法

您所在的位置:网站首页 软件已崩溃 程序崩溃的原因及处理方法

程序崩溃的原因及处理方法

2024-01-30 13:18| 来源: 网络整理| 查看: 265

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

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

一、程序崩溃的定位

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

/////////////// 示例1 //////////////////// #include #include 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); // test(id, name) ->show(p) - 每一次函数里的局部变量(含参变量)的值 - 全部变量的值

这里写图片描述 (*)从上到下,依次是函数的调用层次 (*)每一行由以下信息组成 Hello.exe!show(Object* p=0x00000000)行12+0xc字节 模块名:Hello.exe 函数名: show 参数值:Object*p = 0x00000000 位置:第12行 可以发现,在main()函数之上还有一些东西,那些就是Windows应用程序的框架。 (3)双击某个函数,可以看到这个函数内的局部变量的值 这里写图片描述 注:显示的此时此刻(发生错误的时刻),函数栈上的各个层次的所有局部变量的值。观察它们的值,即可有助于程序员判断到底是哪儿写错了。

三、程序崩溃的原因分类 函数栈溢出 一个变量未初化、未赋值,就读取它的值。 ( 这属于逻辑问题,往往是粗心大意的导致的 )函数栈溢出 (1)定义了一个体积太大的局部变量 (2)函数嵌套调用,层次过深(如无穷递归)数组越界访问 访问数组元素时,下标越界指针的目标对象不可用 (1)空指针 (2)野指针 指针未赋值free/delete释放了的对象不恰当的指针强制转换 3.1 读取未赋值的变量

这种往往是疏忽大意造成的,因为逻辑错误非常明显。

//////////////// 示例 ////////////////// #include #include // 求两数的积 int multiply(int m, int n) { return m * n; } int main() { int a, b; int m = multiply(a, b);//name); } int main() { Object* p = (Object*)malloc(sizeof(Object)); p->id = 123; strcpy(p->name, "邵发"); free(p); // p指向的内存被释放 p->id = 12; //


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3