第七课 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调试 (下),布布扣,bubuko.com

时间: 2024-12-17 03:32:39

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

第六课 GDB调试 (上)

序言: 初学者经过学习前面的Makefile知识,信心满满,内心觉得应该要好好学习不单掌握语言的编写,也要学会相对应的工具调高开发效率.有时我们写出来的代码经过执行结果却跟我们预期不一样那怎么办呢,这个时候就要调试了.说到调试有经验的开发童鞋知道在windows下游大名鼎鼎的VS集成平台,那么在linux下呢,特别是编写C.C++有什么工具可以方便我们调试呢,这里我给大家推荐的就是GDB,它也是GNU的debugger,专门为调试而生的. 知识点: gdb的大致分为以下功能: 1.启动程序: 2

第02课:启动GDB调试

使用GDB调试程序一般有三种方式: gdb filename gdb attach pid dgb filename corename 也对应这本节课的核心内容: 直接调试目标程序 附加进程 调试core文件 接下来我们逐一讲解. 2.1直接调试目标程序 在开发阶段或者研究别人的项目时,当编译成功生成目标二进制文件后,可以使用gdb filename直接启动这个程序的调试,其中filename是需要启动的调试程序文件名,这种方式是直接使用GDB启动一个程序进行调试.注意这里说的启动一个程序进行调

Linux知识(5)----LINUX下GDB调试

参考资料: 1.LINUX下GDB调试

【转】linux下gdb调试

本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者. GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本程序调试工作. 命令 解释 示例 file <文件名> 加载被调试的可执行程序文件. 因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r Run的简写,运行被调试的程序. 如果此前没有下过断点,则执行完整个程序:如果有断点,则程序暂停在第一个可用断点

ios下gdb调试初探

一.调试平台搭建 1.GNU Debugger.首先安装ios下的gdb调试器,添加源:cydia.radare.org .搜索 GNU Debugger,安装之.(有些源的GDB好像不能用,这个测试没问题) 2.openSSH.这个应该都会装,没装过的参考,http://www.cnblogs.com/jailbreaker/p/4142609.html 3.adv-cmds.添加源:apt.saurik.com(这个应该是默认源里的一个). 二.附加步骤 1.首先在ios中打开你要调试的ap

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

GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在 UNIX/Linux平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓“寸有所长,尺有所短”就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让

Linux下GDB调试C/C++

首先先编译程序并生成调试符号: gcc -g -c main.cpp gcc -o exefile main.o 以上的exefile为可执行程序的文件名 然后: gdb exefile 可以开始gdb调试了. 然后在(gdb)那里写入l命令,列出程序源码清单,再次回车是往下列出. (gdb)break linenum 是在代码行号处下断点. 然后(gdb) r 是运行调试程序,r当然就是run的意思 (gdb) n 就是next的意思,单步调试 (gdb) c 就是continue的意思,意味

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gdb-7.2.tar.bz2 这个文件为例.2.解压缩: $ tar jxvf gdb-7.2.tar.bz2 注:小技巧:Linux下一般压缩文件后缀为.tar.bz2和.tar.gz,它们解压命令有两三个选项是一致的: xf(v),前者再加上j选项,后者再加上z选项. 3.进入该目录 $ cd g

gdb调试之linux pc和linux arm环境下

Linux PC应用程序gdb调试: 1.查看core文件参数 [email protected]:~/File_unzip/cp_module$ ulimit -a core file size          (blocks, -c) 0        //产生core文件数目,不会产生core文件 data seg size           (kbytes, -d) unlimited scheduling priority             (-e) 0 file size