`
xxq_2010
  • 浏览: 15713 次
  • 性别: 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>   …………

分享到:
评论

相关推荐

    使用gdb调试linux下的程序.pdf

    在Linux下使用GDB调试程序通常包括以下步骤: 1. 准备调试环境:首先需要一个编译好的程序,通常带有调试信息(即使用-g参数编译)。例如,如果有一个名为hello的简单C程序,可以使用gcc编译器加上-g选项来编译它:...

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

    ##### 使用GDB调试程序 1. **启动GDB**: ```bash gdb tst ``` 启动后会显示GDB版本信息及版权声明。 2. **列出源代码**: 使用 `l` 命令(同 `list`)列出源代码。例如,`l 1` 会从第1行开始列出代码。 ```...

    Linux课件:GDB调试简明指南.pdf

    使用GDB调试这个程序,我们可以演示GDB的典型用法。通过设置断点、逐行执行代码、观察变量变化等一系列操作,开发者能够观察程序在运行过程中的各种细节。 总结起来,GDB是Linux环境下一个不可或缺的调试工具。它...

    用GDB调试程序(整理有书签).pdf

    陈浩的《用GDB调试程序》和守望的个人博客的《GDB调试指南》这两份资料,提供了丰富的实践案例和详细的操作步骤,帮助读者从基础到进阶掌握GDB的使用技巧。通过阅读这些教程,你可以了解如何有效地使用GDB解决实际...

    gdb调试 rk可运行程序

    标题"**gdb调试 RK可运行程序**"指出了我们将在AArch64架构上使用GDB来调试针对Rockchip处理器设计的程序。这通常涉及到嵌入式设备或高性能计算平台,因为Rockchip芯片常见于这些领域。在AArch64架构下,GDB的使用...

    visualgdb调试linux程序

    《VisualGDB调试Linux程序详解》 在现代的软件开发环境中,跨平台的程序调试是一项不可或缺的任务。VisualGDB作为一款强大的Visual Studio扩展工具,它为开发者提供了在Windows环境下调试远程Linux系统的C++应用...

    Linux GDB调试文档

    总结来看,一个合格的Linux C/C++后台开发者应该掌握GDB调试技术,利用这一强大的工具来增强开发过程中的问题诊断和解决能力。GDB的版本不断更新,其功能也在不断增强,例如在*.*.*.**版本中,特别强调了对多线程和...

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

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

    linux c/c++ gdb调试手册

    ### Linux C/C++ GDB调试手册知识点概览 #### GDB概述 - **定义与功能**:GDB(GNU Debugger)是由GNU项目开发的一款强大的调试工具,主要用于在UNIX及类UNIX系统(如Linux)上进行程序调试。它支持C、C++等多种...

    Linux下gdb调试工具指南

    ### Linux下gdb调试工具指南:深入解析与实践 #### 引言 在软件开发领域,尤其是对于系统级编程和复杂应用的维护,一个高效、功能全面的调试工具是不可或缺的。GNU调试器(GDB)正是这样一款强大的调试工具,它...

    linux下GDB调试

    ### Linux 下 GDB 调试工具详解 #### GDB 概述 GDB(GNU Debugger)是一款由GNU项目开发的、广泛应用于Unix系统及类Unix系统的强大调试工具。它支持C、C++、Objective-C、Ada以及Pascal等多种语言,并能够通过标准...

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

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

    gdb_linux下的应用程序GDB调试方法

    ### GDB Linux下的应用程序调试方法 #### 一、引言 GDB(GNU Debugger)作为一款强大且功能全面的调试工具,在Linux环境下被广泛应用于软件开发过程中。它不仅支持多种编程语言,还提供了丰富的特性来帮助开发者...

    使用GDB调试linux软件

    【使用GDB调试Linux软件】 在Linux环境中,开发和维护软件的过程中,调试是必不可少的一环。GDB(GNU调试器)作为一个强大的工具,为开发者提供了深入洞察程序内部工作原理的能力。GDB允许用户查看程序的内存布局,...

    linux gdb 调试手册

    在Linux操作系统中,GDB(GNU调试器)是一款强大的命令行工具,用于调试C、C++、Fortran、Python等编程语言编写的程序。这款工具允许开发者在运行时检查...阅读《Linux GDB调试手册》将有助于深入理解和应用这些知识。

    GDB调试手册(中文版)

    GDB,全称GNU调试器,是Linux和其他类Unix系统下用于调试C、C++、Objective-C、Fortran等语言编写的程序的工具。通过GDB,开发者可以检查程序的运行状态,设置断点,查看变量值,单步执行代码,以及诊断和修复程序中...

    linux 使用GDB调试 资料

    总之,Linux下的GDB调试技巧对于任何开发者来说都是必备技能,无论是在排查复杂问题还是优化代码性能方面,都能发挥巨大作用。通过深入学习和实践,你将能够熟练运用GDB解决各类编程挑战。这份"Debug with GDB"的...

    linuxGDB调试CC++入门.pdf

    Linux GDB 调试 C++ 入门 GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。它可以帮助开发者完成四个方面的功能:启动程序、设置断点、检查程序状态和动态改变执行环境。与图形化调试工具相比,GDB ...

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

    Linux下C++开发中,GDB是一个重要的调试工具,它可以帮助开发者完成程序的调试、测试和优化。GDB提供了强大的调试功能,可以让开发者更方便地调试和优化程序。 GDB概述 -------- GDB是GNU开源组织发布的一个强大的...

Global site tag (gtag.js) - Google Analytics