第七课 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功 ...
随机推荐
- hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)
/** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...
- 【BZOJ】3301: [USACO2011 Feb] Cow Line(康托展开)
http://www.lydsy.com/JudgeOnline/problem.php?id=3301 其实这一题很早就a过了,但是那时候看题解写完也是似懂非懂的.... 听zyf神犇说是康托展开, ...
- python import错误 SyntaxError: invalid syntax
导入一个叫service-listener.py的文件是一直遇到错误: SyntaxError: invalid syntax 单独运行service-listener这个文件时,没有问题,只是不能被 ...
- linux配置sftp用户的chroot步骤(用户的sftp根文件夹)
1.编辑ssh中的sftp的配置,命令可能是:vi /etc/ssh/sshd_config 在这个文件里最后增加 #限制sftp组的用户使用sftp时在自己的home文件夹下 Match Group ...
- hdu 5090 Game with Pearls(最大匹配)
Game with Pearls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.4——使用Espresso测试Activity
问题: 你想要使用Google的Espresso测试Activity. 解决方案: 在Gradle配置里面增加Espresso,书写测试脚本. 讨论: Espresso测试库已经被添加进“Androi ...
- boost::archive::binary_iarchive
#include <iostream> #include <string> #include <sstream> #include <vector> # ...
- css 横线中间添加文字
demoline01.02选一个用足够了 <style> .demo_line_01 { width: 200px;/*这指的是文字的宽度*/ padding: 0 20px 0; m ...
- CodeForces 156B Suspects(枚举)
B. Suspects time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- Storm的组件
摘自网上 当时写的很好,很详细的介绍了各个组件直接的关系 Storm集群和Hadoop集群表面上看很类似.但是Hadoop上运行的是MapReduce jobs,而在Storm上运行的是拓扑(topo ...