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. Handler笔记

    5.Handler内存泄露 在一个Activity里面,如果没有静态地创建一个Handler,有可能导致内存泄露. 因为Hander和Looper绑定,如果looper的MessageQueue有消息 ...

  2. Red5点播和直播的实现

    (一)        Red5流媒体服务器介绍Red5是一个采用Java开发开源的Flash流媒体服务器.它支持:把音频(MP3)和视频(FLV)转换成播放流: 录制客户端播放流(只支持FLV):共享 ...

  3. codeforces 652B z-sort(思维)

    B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  4. [转]sql server 数据库日期格式化函数

    转至:http://www.cnblogs.com/hantianwei/archive/2009/12/03/1616148.html 0   或   100   (*)     默认值   mon ...

  5. ADO.NET 快速入门(十):过滤数据

    我们有很多方法来过滤数据.一种是在数据库命令级别,利用 where 子句查询过滤数据.另一种是在数据填充到 DataSet 以后过滤数据.本篇讨论后者.   一旦数据填充到 DataSet,你可以使用 ...

  6. OA系统权限管理设计(转载)

    不论什么系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统加入亮点. l         不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是 ...

  7. Codeforces Gym 100637G G. #TheDress 暴力

    G. #TheDress Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100637/problem/G ...

  8. 从零开始学习Hadoop--第1章 Hadoop的安装

    Hadoop的安装比较繁琐,有如下几个原因:其一,Hadoop有非常多的版本:其二,官方文档不尽详细,有时候更新脱节,Hadoop发展的太快了:其三,网上流传的各种文档,或者是根据某些需求定制,或者加 ...

  9. 小学生玩ACM----优先队列

    思来想去,本人还是觉得,这个优先队列啊,不学不行,怎么说咧?虽说有时候我可以模仿它的功能,但是有的题目会坑的我大放血,况且多学会用一个小东东总不会伤身的撒,何况我是永举不垂的,哦耶,嘿嘿 优先队列嘛就 ...

  10. IOS AutoLayout 文章

    开始iOS 7中自动布局教程(一) 开始iOS 7中自动布局教程(二) 代码的方式自动布局 自动布局时计算Cell高度