第七课 GDB调试 (下)
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调试 (下)的更多相关文章
- 第六课 GDB调试 (上)
1序言: 1.初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办 ...
- 第02课:启动GDB调试
使用GDB调试程序一般有三种方式: gdb filename gdb attach pid dgb filename corename 也对应这本节课的核心内容: 直接调试目标程序 附加进程 调试co ...
- Linux下用gdb 调试、查看代码堆栈
Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...
- 第二课:启动 GDB 调试
使用 GDB 调试程序一般有三种方式: gdb filename gdb attach pid gdb filename corename 这也对应着本节课的核心内容: 直接调试目标程序 附加进程 调 ...
- Linux下GDB调试
GDB 是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行 序列,形成脚本.UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行 软件的优势在于, 他们可以非常容 ...
- Linux下GDB调试C/C++
首先先编译程序并生成调试符号: gcc -g -c main.cpp gcc -o exefile main.o 以上的exefile为可执行程序的文件名 然后: gdb exefile 可以开始gd ...
- Linux gcc/g++下GDB调试及其调试脚本的使用
GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB ...
- mac下配置gdb调试golang
mac下配置gdb调试golang 原文链接 https://sourceware.org/gdb/wiki/BuildingOnDarwin Building GDB for Darwin Crea ...
- Ubuntu 16.04下GDB调试
在linux中还有一个更受大家欢迎的调试工具:GDB.GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.可以用来调试C,C++程序. GDB功 ...
随机推荐
- transform使用参考指南
transform使用参考指南 2010-09-18 16:06:33| 分类: html5+css3|字号 订阅 语法 transform :none | <transform-fu ...
- JMeter基础之-使用技巧
在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享.本文内容如下. 如何使用英文界面的jmeter 如何使用镜像服务器 Jmeter分布式测试 启动Deb ...
- 苹果mac版微软官方远程连接工具下载Microsoft Remote Desktop For Mac
官网beta版本,不用再到处找包了. ** 点我访问https://rink.hockeyapp.net/apps/5e0c144289a51fca2d3bfa39ce7f2b06/**
- debug命令
debug -r 查看寄存器-a 输入指令-t 执形命令 通用寄存器:AX=AH+ALBX=BH+BLCX=CH+CLDX=DH+DL 2Byte 16bitFFFF0-(2的16次方减1) debu ...
- PHP手机号码归属地查询API接口
淘宝网 API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 参数: tel:手机号码 返回:JSON ...
- 【转】MySQL常用命令总结
http://blog.csdn.net/qq_33850438/article/details/52144686 MySQL常用的基本操作,以下都是MySQL 5.0下测试通过首先说明下,记住在每个 ...
- 文件夹进行MD5校验的实现算法
每份相同数据(文件夹)都可以生成一份唯一的md5校验文件,我们可以通过直接校验整个数据文件夹的方法来确定数据是否有误. 1.针对整个文件夹生成md5校验文件方法: 以data文件夹为例,我们需要得到d ...
- 酷壳用的还是 Wordpress
WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. http: ...
- android eclipse 环境配置(win 7)
一.下载安装android SDK 两种方式: (1)官网下载(需FQ):https://developer.android.com/studio/index.html (2)无需FQ下载:http: ...
- 【BZOJ2527】[Poi2011]Meteors 整体二分
[BZOJ2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ...