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. JDBC学习笔记(10)——调用函数&存储过程

    如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个CallableStatement *    对象的实例,在使用Con ...

  2. BAT-使用BAT方法删除目录下0KB文件

    @Echo Off For /f "tokens=*" %%i in ('dir /a-d /b /s "*.*"') do ( If " (Del ...

  3. Linux上svn服务器的搭建

    安装svn服务器 直接用yum安装,命令如下: #yum install -y subversion 验证是否安装成功. #svnserve --version 创建SVN版本库 在home目录下创建 ...

  4. FIREDAC调用中间件远程方法查询数据示例

    服务端使用FDQUERY查询数据并返回TDATASET: function TServerMethods1.GetData(var sql: string): tdataset;begin qry.C ...

  5. 在C#调用C++的DLL简析(一)——生成非托管dll

    经过一晚上的折腾,还是下点决心将些许的心得写下来,以免以后重复劳动. C#与C/C++相 比,前者的优势在于UI,后者的优势在于算法,C++下的指针虽然恶心,若使用得当还是相当方便的,最重要的问题是, ...

  6. Scala List的排序函数sortWith

    //原始方法: //val list=List("abc","bcd","cde") scala> list.sortWith( (s ...

  7. Castle框架中的IOC和AOP机制

    反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...

  8. SQLite本地事务处理

    private void toolStripButton1_Click(object sender, EventArgs e) { //判断新增的年度是否已经存在 if (HasYear()) { M ...

  9. ADO.NET 快速入门(七):使用数据库事务

    数据库事务用于控制数据提交到数据库.例如,在标准的账户程序,账户的借贷必须同时完成.由于电脑偶尔发生故障(电力中断.网络中断,等等),可能有些记录被更新或者添加,但是另外一些没有.为了避免这些情况,可 ...

  10. oracle 基本语句练习(一) where, between ,null, like,转义字符,order by

    1   where  筛选关键字; select * from emp where job >'CLERK' 从emp表中列出 job值大于'CLERK'的项 (由于比较的是字符串,所以加单引号 ...