1序言:

  通过前面一节第六课 GDB调试 (下)文章,可以掌握理解了gdb调试:怎么启动、运行,打断点、查看变量、甚至改变变量等的知识,今天来大概讲解下调试bug的类型。

2知识点:

  2.1 就像之前所说的没有任何一个程序员敢打包票自己写的代码是没任何bug,bug总会有意无意的出现在我们眼前,当程序运行结果于我们预期结果不一样的时候这时候我们就应该调试,总的来说bug分为:语法错误、逻辑错误、硬件异常;

3原理:

  3.1 语法错误:一般情况下出现在编译的时候会有提示编译错误这时候我们就可以马上定位查看并解决;

  3.2 逻辑错误:这种情况比较复杂有时候的逻辑错误是肉眼能看出来的,有时候是需要调试就可以出来的,还有时候要经过多次调试找到bug产生环境的时候才出来,也就是说正式环境跟调试环境差别而增加调试难度。

  3.3 硬件异常:这种问题在一般的设备是比较容易调试,特别是在高级语言中可以异常捕获,但是在低级语言是比较难点的!

  接下来看看这几种情况的调试。

4实践:

  4.1 语法错误

    4.1.1 新建如下test.c文件,并输入:

#include <stdio.h>

int main(void)
{
int a = 10;
printf("a:%f",a);
return 0;
}

     4.1.2 编译将会产生错误,提示在main函数中找不到print函数,修正下即可:

  4.2 逻辑错误

    4.2.1 重新编写test.c文件,输入如下:

#include <stdio.h>

int main(void)
{
int i;
char str[6] = "hello";
char reverse_str[6] = "";
printf("%s\n",str);
for(i = 0;i < 5;i++)
{
reverse_str[5-i] = str[i];
}
printf("%s\n",reverse_str);
return 0;
}

    4.2.2 编译后执行查看结果没有任何输出:

    4.2.3 调试程序:gdb test.c,并查看行好打断点,我们在第13行打断点:

    4.2.4 经过上面打印变量输出“\000olleh",大家就可以想到,原因是由于字符串结尾\0引起的,此时我们在str最大下标处不要5开始就可以解决,修改后编译运行如下:

  4.3 段错误

    4.3.1 重新编辑test.c文件,输入如下:

#include <stdio.h>

void test()
{
  int *p = NULL;
  *p = 100;
} int main(void)
{
  test();
return 0;
}

  

    4.3.2 编译运行报错,提示段错误。接下来进行调试跟踪,这里可以直接加载文件运行,在段错误的地方会暂停,此时我们打印相关信息查看即可。

    4.3.4 修改*p初始值即可,特别注意:有时段错误可能不在当前报错会在以后代码运行中导致错误。

  4.4 core文件调试

    4.4.1 查看当前是否有core文件,file size为0说明没有:

    4.4.2 此时没就需要设置core文件:

ulimit -c unlimited    #设置

    4.4.3 直接运行程序回报段错误(core dumped),此时也会在当前目录生成core文件。开始调试:gdb test core.268181

    这个core文件很有用,它会保存之前的环境更有利于调试,接近真实。这里注意知识点core的查看以及设置、加载调试。    

 

第七课 GDB调试 (下)的更多相关文章

  1. 第六课 GDB调试 (上)

    1序言: 1.初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办 ...

  2. 第02课:启动GDB调试

    使用GDB调试程序一般有三种方式: gdb filename gdb attach pid dgb filename corename 也对应这本节课的核心内容: 直接调试目标程序 附加进程 调试co ...

  3. Linux下用gdb 调试、查看代码堆栈

      Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...

  4. 第二课:启动 GDB 调试

    使用 GDB 调试程序一般有三种方式: gdb filename gdb attach pid gdb filename corename 这也对应着本节课的核心内容: 直接调试目标程序 附加进程 调 ...

  5. Linux下GDB调试

    GDB 是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行 序列,形成脚本.UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行 软件的优势在于, 他们可以非常容 ...

  6. Linux下GDB调试C/C++

    首先先编译程序并生成调试符号: gcc -g -c main.cpp gcc -o exefile main.o 以上的exefile为可执行程序的文件名 然后: gdb exefile 可以开始gd ...

  7. Linux gcc/g++下GDB调试及其调试脚本的使用

    GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB ...

  8. mac下配置gdb调试golang

    mac下配置gdb调试golang 原文链接 https://sourceware.org/gdb/wiki/BuildingOnDarwin Building GDB for Darwin Crea ...

  9. Ubuntu 16.04下GDB调试

    在linux中还有一个更受大家欢迎的调试工具:GDB.GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.可以用来调试C,C++程序. GDB功 ...

随机推荐

  1. Shoot the Bullet ZOJ - 3229 有源汇有上下界的最大流

    /** zoj提交评判不了,所以不知道代码正不正确.思路是应该没问题的.如果有不对的地方,请多指教. 题目:Shoot the Bullet ZOJ - 3229 链接:https://vjudge. ...

  2. 请写出5种常见到的runtime exception。

    请写出5种常见到的runtime exception. 解答: NullPointerException:当操作一个空引用时会出现此错误. NumberFormatException:数据格式转换出现 ...

  3. 用HTML创建表格

    本章目标:了解掌握表格的基本结构<table><tr><th><td> 掌握跨行.跨列属性colspan rowspan 掌握表格相关修饰属性borde ...

  4. windows下解决mysql忘记password

    windows下解决mysql忘记password   mysql有时候忘记password了怎么办?我给出案例和说明!一下就攻克了!    Windows下的实际操作例如以下    1.关闭正在执行 ...

  5. html5 webwork

    在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出“脚本运行时间过长“的提示框,如果出现这种情况说明你的脚本已经失控了. 一个浏览器至少存在三个线程:js引擎线程(处理js).GUI渲 ...

  6. boost实用工具:assign库了解学习

    许多时候,我们需要为容器初始化或者赋值,填入大量的数据; STL容器仅提供了容纳这些数据的方法,但是填充的步骤是相当地麻烦(insert.push_back); 于是,boost::assign出现了 ...

  7. CommonJS和AMD/CMD

    JS中的模块规范(CommonJS,AMD,CMD) 一,CommonJS NodeJS是CommonJS规范的实现,webpack也是以CommonJS的形式来书写. 在浏览器环境下,没有模块也不是 ...

  8. 【BZOJ3144】[Hnoi2013]切糕 最小割

    [BZOJ3144][Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q ...

  9. 160629、 DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较

       简介   使用评价  项目主页  DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可以设置最大和最小连接,连接等 ...

  10. 原生JS返回顶部,带返回效果

    有些网站当滑到一定高度时右下角会有一个按钮,你只要一点就可以直接返回顶部了.那这个功能是怎么做到的呢.其实不算太难: 首先我们先在网页中创建一个按钮,上面写上返回顶部,把它的样式改成固定定位,之后想要 ...