`
xxq_2010
  • 浏览: 14724 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

GDB调试Linux下的C++程序

阅读更多
gdb
求助编辑百科名片
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

目录

功能
一 :文件清单
二:执行程序
三:显示数据
四:断点(breakpoint)
五.断点的管理
六.变量的检查和赋值
七. 单步执行
八.函数的调用
九.机器语言工具
十.信号
GDB的使用方法
用GDB调试程序功能
一 :文件清单
二:执行程序
三:显示数据
四:断点(breakpoint)
五.断点的管理
六.变量的检查和赋值
七. 单步执行
八.函数的调用九.机器语言工具十.信号GDB的使用方法用GDB调试程序展开 编辑本段功能
  一般来说,GDB主要帮忙你完成下面四个方面的功能:
    1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    3、当程序被停住时,可以检查此时你的程序中所发生的事。
    4、动态的改变你程序的执行环境。   《GDB使用手册》
编辑本段一 :文件清单

    List
    (gdb) list line1,line2
编辑本段二:执行程序
  要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
    (gdb)set args –b –x
    (gdb) show args
    backtrace命令为堆栈提供向后跟踪功能。
    Backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
编辑本段三:显示数据
  利用print 命令可以检查各个变量的值。
    (gdb) print p (p为变量名)
    print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:   对程序中函数的调用
    (gdb) print find_entry(1,0)   数据结构和其他复杂对象
    (gdb) print *table_start
    ={e=reference=’\000’,location=0x0,next=0x0}   值的历史成分
    (gdb)print (为历史记录变量,在以后可以直接引用的值)   人为数组   人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:
    base@length   因此,要想显示在h后面的10个元素,可以使用h@10:
    (gdb)print h@10
    =(-1,345,23,-234,0,0,0,98,345,10)
    whatis 命令可以显示某个变量的类型
    (gdb) whatis p
    type = int *
编辑本段四:断点(breakpoint)

    break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:
    break line-number 使程序恰好在执行给定行之前停止。
    break function-name 使程序恰好在进入指定的函数之前停止。
    break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
    break routine-name 在指定例程的入口处设置断点   如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:
    (gdb) break filename:line-number
    (gdb) break filename:function-name   要想设置一个条件断点,可以利用break if命令,如下所示:
    (gdb) break line-or-function if expr   例:
    (gdb) break 46 if testsize==100   从断点继续运行:continue 命令
编辑本段五.断点的管理

    1.显示当前gdb的断点信息:
    (gdb) info break   他会以如下的形式显示所有的断点信息:
    Num Type Disp Enb Address What
    1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
    2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168   删除指定的某个断点:
    (gdb) delete breakpoint 1   该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点
    (gdb) delete breakpoint   禁止使用某个断点
    (gdb) disable breakpoint 1   该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n   允许使用某个断点
    (gdb) enable breakpoint 1   该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y   清除原文件中某一代码行上的所有断点
    (gdb)clean number   注:number 为原文件的某个代码行的行号
编辑本段六.变量的检查和赋值

    whatis:识别数组或变量的类型
    ptype:比whatis的功能更强,他可以提供一个结构的定义
    set variable:将值赋予变量
    print 除了显示一个变量的值外,还可以用来赋值
编辑本段七. 单步执行

    next 不进入的单步执行
    step 进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
编辑本段八.函数的调用

    call name 调用和执行一个函数
    (gdb) call gen_and_sork( 1234,1,0 )
    (gdb) call printf(“abcd”)
    =4
    finish 结束执行当前函数,显示其返回值(如果有的话)
编辑本段九.机器语言工具
  有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:
    $pc : 程序计数器
    $fp : 帧指针(当前堆栈帧)
    $sp : 栈指针
    $ps : 处理器状态
编辑本段十.信号

    gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。
    Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:
    nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
    stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)
    print 接受到信号时显示一条消息
    noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)
    pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
    nopass 停止程序运行,但不要将信号发送给程序。   例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:
    (gdb) handle SIGPIPE stop print   请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:   (gdb) signal 2
    continuing with signal SIGINT(2)   该程序继续执行,但是立即传输该信号,而且处理程序开始运行。
编辑本段GDB的使用方法

    GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成   执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的   便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已   有工具的命令,就可以做出一个非常强大的功能。   于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合   成更为强劲的功能。而Windows下的图形软件基本上是各自为营,互相不能调用,很   不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较,所谓“寸有   所长,尺有所短”,图形化工具还是有不如命令行的地方。
编辑本段用GDB调试程序

    GDB概述   ————
    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢   那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你   会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所   长,尺有所短”就是这个道理。   一般来说,GDB主要帮忙你完成下面四个方面的功能:
    1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    3、当程序被停住时,可以检查此时你的程序中所发生的事。
    4、动态的改变你程序的执行环境。   从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过   在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工   具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一   一看来。   一个调试示例   ——————   源程序:tst.c
    1 #include
    2
    3 int func(int n)
    4 {
    5 int sum=0,i;
    6 for(i=0; i<=n; i++)
    7 {
    8 sum+=i;
    9 }
    10 return sum;
    11 }
    12
    13
    14 main()
    15 {
    16 int i;
    17 long result = 0;
    18 for(i=1; i<=100; i++)
    19 {
    20 result += i;
    21 }
    22
    23 printf("result[1-100] = %d \n", result );
    24 printf("result[1-250] = %d \n", func(250) );
    25 }   编译生成执行文件:(Linux下)
    hchen/test> gcc -g tst.c -o tst   使用GDB调试:
    hchen/test> gdb tst <---------- 启动GDB
    GNU gdb 5.1.1
    Copyright 2002 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB. Type "show warranty" for details.
    This GDB was configured as "i386-suse-linux"...
    (gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
    1 #include
    2
    3 int func(int n)
    4 {
    5 int sum=0,i;
    6 for(i=0; i<=n; i++)
    7 {
    8 sum+=i;
    9 }
    10 return sum;
    (gdb) <-------------------- 直接回车表示,重复上一次命令
    11 }
    12
    13
    14 main()
    15 {
    16 int i;
    17 long result = 0;
    18 for(i=1; i<=100; i++)
    19 {
    20 result += i;
    (gdb) break 16 <-------------------- 设置断点,在源程序第16行处。
    Breakpoint 1 at 0x8048496: file tst.c, line 16.
    (gdb) break func <-------------------- 设置断点,在函数func()入口处。
    Breakpoint 2 at 0x8048456: file tst.c, line 5.
    (gdb) info break <-------------------- 查看断点信息。
    Num Type Disp Enb Address What
    1 breakpoint keep y 0x08048496 in main at tst.c:16
    2 breakpoint keep y 0x08048456 in func at tst.c:5
    (gdb) r <--------------------- 运行程序,run命令简写
    Starting program: /home/hchen/test/tst
    Breakpoint 1, main () at tst.c:17 <---------- 在断点处停住。
    17 long result = 0;
    (gdb) n <--------------------- 单条语句执行,next命令简写。
    18 for(i=1; i<=100; i++)
    (gdb) n
    20 result += i;
    (gdb) n
    18 for(i=1; i<=100; i++)
    (gdb) n
    20 result += i;
    (gdb) c <--------------------- 继续运行程序,continue命令简写。
    Continuing.
    result[1-100] = 5050 <----------程序输出。
    Breakpoint 2, func (n=250) at tst.c:5
    5 int sum=0,i;
    (gdb) n
    6 for(i=1; i<=n; i++)
    (gdb) p i <--------------------- 打印变量i的值,print命令简写。
    = 134513808
    (gdb) n
    8 sum+=i;
    (gdb) n
    6 for(i=1; i<=n; i++)
    (gdb) p sum
    = 1
    (gdb) n
    8 sum+=i;
    (gdb) p i
    = 2
    (gdb) n
    6 for(i=1; i<=n; i++)
    (gdb) p sum
    = 3
    (gdb) bt <--------------------- 查看函数堆栈。
    #0 func (n=250) at tst.c:5
    #1 0x080484e4 in main () at tst.c:24
    #2 0x400409ed in __libc_start_main () from /lib/libc.so.6
    (gdb) finish <--------------------- 退出函数。
    Run till exit from #0 func (n=250) at tst.c:5
    0x080484e4 in main () at tst.c:24
    24 printf("result[1-250] = %d \n", func(250) );
    Value returned is = 31375
    (gdb) c <--------------------- 继续运行。
    Continuing.
    result[1-250] = 31375 <----------程序输出。
    Program exited with code 027. <--------程序退出,调试结束。
    (gdb) q <--------------------- 退出gdb。  hchen/test>   …………

分享到:
评论

相关推荐

    linux 用GDB调试C和C++程序

    linux 用GDB调试C和C++程序,这个文档是我从http://wiki.ubuntu.org.cn/index.php?title=用GDB调试程序&variant=zh-cn 上面复制,然后进行编辑之后,为了方便我的打印,我编辑好了的,如果没有积分可以去这个网站...

    linux c/c++ gdb调试手册

    linux c/c++ gdb调试手册

    linux的C++程序gdb调试方法

    GDB(GNU Debugger)是一个功能强大的Unix下的程序调试工具。以下是使用GDB进行调试的基本方法和步骤: 启动GDB 使用gdb命令后跟上你想要调试的程序名来启动GDB。例如: bash gdb myprogram 设置断点 在程序的特定...

    Linux GDB调试文档

    使用GDB调试,英文版。对于从事 Linux C/C++ 后台开发的读者来说,GDB 调试是需要熟练掌握的一项技能

    gdb 调试 GCC 程序

    Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值...

    使用GDB调试Linux软件文档

    文档描述了如何在linux上使用GDB进行调试C、C++程序

    Linux GDB C/C++调试基础与提升课程

    分享一套课程——Linux GDB C/C++调试基础与提升视频课程,提供源码+PPT下载。

    Linux下C++开发GDB中文手册

    Linux下C++开发,GDB是重要的调试工具

    linux c++调试工具gdb方法使用

    linux c++调试工具gdb方法使用,对于开发linux服务器程序非常有用

    GDB调试流程及命令大全

    GDB(GNU调试器)是一种功能强大的命令行调试工具,常用于C、C++、汇编等编程语言的调试。它支持多种平台和格式,可以在Linux、UNIX和Windows等操作系统上使用。GDB提供了很多调试功能,包括设置断点、单步执行、...

    Linux GDB C/C++调试基础与提升

    Linux GDB C/C++调试基础与提升视频教程分享,视频+源码+PPT下载 一、gdb的概述 gdb是GNU开源组织发布的一个强大的UNIX下的程序调试工具。 二、gdb的使用场景 启动你的程序,可以按照你的自定义的要求随心所欲的...

    linuxGDB调试CC++入门.pdf

    linuxGDB调试CC++入门.pdf

    Linux下的GDB调试手册

    在linux下对程序的调试,对崩溃的调试,有对gdb的详细讲解

    linux下如何用GDB调试c++程序

    如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。

    gdb调试程序

    linux下gdb的调试c c++ 程序的扼要流程介绍,通过实例让你快速上手,看完就能学会基本的使用

    Linux开发入门:使用gdb调试C/C++入门教程

    像所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此时你可以查看变量、寄存器、内存及堆栈。更进一步你可以修改变量及内存值。GDB是一个功能很强大的调试器,它可以调试多种语言。在此...

    gdb调试方式展示

    Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值...

    GBD(linux下的程序调试).pdf

    linux下的gdb使用方法,教你如何在linux下进行程序调试 linux下的gdb使用方法,教你如何在linux下进行程序调试 linux下的gdb使用方法,教你如何在linux下进行程序调试 linux下的gdb使用方法,教你如何在linux下进行...

    Linux GDB C、C++调试基础与提升视频课程

    分享课程——Linux GDB C、C++调试基础与提升视频课程

    用GDB调试C程序小结.ppt

    使用GDB调试c程序总结,里面有包含如何查看core文件指令,可以跟到代码崩溃的具体地方,在linux下调试十分有用。

Global site tag (gtag.js) - Google Analytics