第七课 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功 ...
随机推荐
- Enable Authentication on MongoDB
1.Connect to the server using the mongo shell mongo mongodb://localhost:27017 2.Create the user admi ...
- Elasticsearch增、删、改、查操作深入详解
引言: 对于刚接触ES的童鞋,经常搞不明白ES的各个概念的含义.尤其对“索引”二字更是与关系型数据库混淆的不行.本文通过对比关系型数据库,将ES中常见的增.删.改.查操作进行图文呈现.能加深你对ES的 ...
- 【学习ATX基于uiautomator2】之API操作Android方法
具体API可参考:<uiautomator2>以及参考github官方文档 感谢:Ricky_Frog <Python+uiautomator2手机UI自动化测试实战 -- 2. 用 ...
- Xcode下开发c静态库for ios CPU架构 静态库合并
新建一个Cocoa Touch Static Library工程 1,先在工程左侧删除“工程名Tests”下的文件与文件夹(从内往外删,最后删除"工程名Tests文件夹") :D ...
- net mvc 小目标
1.前台视图去找指定的控制器(非默认) 2.控制器去找指定的视图(非默认)
- 2017 ACM区域赛(南宁站) 参赛流水账
day0: 早上四点起床赶飞机,还好没有吵醒室友导致被打死.本来想在飞机上准备一下下周的小测,结果飞机一点都不平稳,只能全程和队友吹逼聊天.下午在宾馆里和johann通关了一部合金弹头,重温了童年的经 ...
- Java逍遥游记读书笔记<二>
Abstract抽象类 1.抽象类不能被实例化 2.抽象方法没有方法体 如: public abstract class Weapen { public abstract void attack(); ...
- 使用JMAP dump及分析dump文件
查看整个JVM内存状态 jmap -heap [pid]要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况jmap -his ...
- tsinsen A1333. 矩阵乘法
题目链接:传送门 题目思路:整体二分(二分的是答案,附带的是操作) 把矩阵中的元素对应成插入操作,然后就有插入和询问操作. 然后根据插入操作对于答案的影响,询问操作所匹配的符合答案个数,将操作分为两段 ...
- Leetcode-Combinations Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...