Linux系统中包含了GNU 调试程序gdb,它是一个用来调试C和 C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。

  GDB提供了一下一些功能:

(1)监视程序中变量的值;

(2)设置断点以使程序在制定的代码上上运行;

(3)一行一行的执行代码。

  gdb程序调试的对象是可执行文件,,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb 利用这些信息使源代码和机器码相关联。

  启动gdb后,可以在命令行制定很多选项,也可以用下面的方式在命令行中指定想要调试的文件名:

    $ gdb filename

  此时,gdb会装入名为filename的可执行文件,用这种方式运行gdb可以直接指定想要调试的程序。也可以用gdb去检查一个因程序异常终止而产生的core文件,或者与一个正在运行的程序相连。

  下面举个实例来介绍如何一步步的用gdb调试程序,显示一个简单的“Hello World!”,再用凡需将此输出。代码如下:

 /*lxy1.c*/
#include<stdio.h>
void print1(char *string)
{
printf("The string is :%s\n",string);
}
void print2(char *string)
{
char *string2;
int size,i;
size = strlen(string);
string2 = (*char) malloc(size+);
for(i = ;i<size;i++)
string2[size-i] = string[i];
string2[size+] = ‘\‘;
printf("The string printed backward is:%s\n",string2);
free(string2);
} main()
{
char test_string []="Hello World!";
print1(test_string);
print2(test_string);
}

lxy1.c

  $gcc -o lxy1 lxy1.c

   编译成功后,执行lxy1:

  ./lxy1

程序显示的结果如下:

  The string is:Hello World!

  The string printed backward is:

可知第二行输出时错误的 ,现在用gdb进行调试,重新编译如下:

  $gcc -o lxy1 lxy1.c -g

现在可以用gdb对gdbtest进行调试,输入命令如下:

  $gdb lxy1

这个命令将载入lxy1可执行文件,进入gdb后,输入run命令运行lxy1,结果如下:

  Staring program:/home/lxy/book/src/chapter2/lxy1

    The string is:Hello World!

  The string printed backward is:

  program exited normally

为了找出问题在哪,在gdb下输入list命令可列出源代码。由一系列分析知道在14行设置断点,应该输入下面的命令

  (gdb)break 14

  Breakpoint 1 at 0x80484ee:file lxy1.c,line 14.

再输入run,将产生如下的输出:

  (gdb)run

  Staring program:/home/lxy/book/src/chapter2/lxy1

    The string is:Hello World!

  Breakpoint 1 ,print2(string=0xbffff32d"Hello World!") at lxy1.c:14

  14        string2[size-i] = string[i];

由此可知道程序停在13行“string2[size-i]=string[i]”,可以通过设置一个观察点来观察string2[size-i]变量的值,看错误咋产生的。如下:

  (gdb)watch string2[size-i]

  Hardware watchpoint 2:string2[size-i]

输入命令 C 使程序继续执行,直到停止在下次循环体语句中,这里可知string2[size-i]= string[i]应修正为string2[size-i-1]= string[i].

通过这个例子,知道了gdb程序的调用、在gdb中显示源文件、设置断点、观察变量、单步执行等。需要多加练习。。

GDB调试器简介的更多相关文章

  1. Mac os系统gdb调试器的安装与使用

    Mac os系统gdb调试器的安装与使用 1.简介 Mac os下的Terminal 终端中默认情况下并没有安装gdb调试器,但是可以通过gcc编译器进行代码编译,如果出错了就需要通过gdb调试器进行 ...

  2. linux基础2——gdb调试器

    gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...

  3. GCC编译器和GDB调试器常用选项

    http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello                 ...

  4. Linux C 程序 函数,数组,指针,gdb调试器(SEVEN)

    函数,数组,指针,gdb调试器 1.函数定义 如果明确指定返回类型,默认为int 参数传递:实参对形参的参数传递是单向的,实参只是把自己的值赋给形参.                      形参的 ...

  5. 使用GDB调试器(一)

    使用GDB调试器 GDB概要---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软 ...

  6. Linux gdb调试器用法全面解析

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序. 让被调试的程序在工程师指定的断 ...

  7. Ubuntu下GDB调试器的使用

    gdb调试器时一款GNU组织开发.发布的UNIX/Linux环境下的程序调试工具,没有图形界面,但功能强大. GDB使用流程: 先编写一个测试文件gdbTest.c 保存后用gcc对文件进行编译,需要 ...

  8. gdb调试器在windows下的相关内容

    1.gdb调试器在visual studio或dev c++中也有类似的调试图形化可视界面,但是gdb不同的是它是由命令行组成,他的界面对于习惯图形化可视界面的用户来说一时间会不知所措 2.通过gcc ...

  9. @清晰掉 GDB调试器中的战斗机

    GDB 的命令很多,本文不会全部介绍,仅会介绍一些最常用的.在介绍之前,先介绍GDB中的一个非常有用的功能:补齐功能.它就如同Linux下SHELL中的命令补齐一样.当你输入一个命令的前几个字符,然后 ...

随机推荐

  1. 软件工程第一次个人项目——词频统计by11061153柴泽华

    一.预计工程设计时间 明确要求: 15min: 查阅资料: 1h: 学习C++基础知识与特性: 4-5h: 主函数编写及输入输出部分: 0.5h: 文件的遍历: 1h: 编写两种模式的词频统计函数: ...

  2. Codeforces 599D Spongebob and Squares(数学)

    D. Spongebob and Squares Spongebob is already tired trying to reason his weird actions and calculati ...

  3. BestCoder Round #65 hdu5590(水题)

    ZYB's Biology Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  4. ArcGIS10的GDB文件解析(初步)

    早就应该写一写关于esri的一些改变 参考http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//006z000000tr00000 ...

  5. 回顾JDBC

    最近因为公司的需要,一直在做我司商城的修改和维护,好几个月没有接触过java的代码了,有点手生,就算是开发java 的web项目,持久层习惯用hibernate,jdbc很少用.hibernate实现 ...

  6. 利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

    转自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括, ...

  7. mac下批量删除.svn文件

    mac下.svn是隐藏文件,而且即使我们调成可见的,一个一个删也很麻烦.今天正好同事问起来这个命令,于是想可能有些人也需要,于是还是放到博客里吧 命令比较简单,其实就是一条linux命令,打开终端,首 ...

  8. ios 7.1 7.1.1 半完美越狱后 电脑訪问手机越狱文件夹的方法

    7.1和7.1.1因为越狱不成熟,半完美越狱后电脑上无法訪问系统越狱文件夹,如var usr 等等. 今天有些意外地发现,能够在电脑上使用手机的越狱文件夹我手机 i4 7.1.1 联通 半完美越狱,没 ...

  9. Codeforces Round #328 (Div. 2) A. PawnChess 暴力

    A. PawnChess Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/592/problem/ ...

  10. TinyXML:一个优秀的C++ XML解析器[转]

    TinyXML:一个优秀的C++ XML解析器 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似 ...