`
weiyuhu
  • 浏览: 231229 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

GDB教程四

阅读更多
、设置显示选项

    GDB中关于显示的选项比较多,这里我只例举大多数常用的选项。

    set print address
    set print address on
        打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,如:
      
        (gdb) f
        #0  set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
            at input.c:530
        530         if (lquote != def_lquote)


    set print address off
        关闭函数的参数地址显示,如:
      
        (gdb) set print addr off
        (gdb) f
        #0  set_quotes (lq="<<", rq=">>") at input.c:530
        530         if (lquote != def_lquote)

    show print address
        查看当前地址显示选项是否打开。
      
    set print array
    set print array on
        打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下,我就不再多说了。
      
    set print array off
    show print array

    set print elements <number-of-elements>
        这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个<number-of-elements>来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。
      
    show print elements
        查看print elements的选项信息。
      
    set print null-stop <on/off>
        如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。
      
    set print pretty on
        如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。如:

            $1 = {
              next = 0x0,
              flags = {
                sweet = 1,
                sour = 1
              },
              meat = 0x54 "Pork"
            }

    set print pretty off
        关闭printf pretty这个选项,GDB显示结构体时会如下显示:
      
            $1 = {next = 0x0, flags = {sweet = 1, sour = 1}, meat = 0x54 "Pork"}
          
    show print pretty
        查看GDB是如何显示结构体的。
      
  
    set print sevenbit-strings <on/off>
        设置字符显示,是否按“\nnn”的格式显示,如果打开,则字符串或字符数据按\nnn显示,如“\065”。
  
    show print sevenbit-strings
        查看字符显示开关是否打开。
      
    set print union <on/off>
        设置显示结构体时,是否显式其内的联合体数据。例如有以下数据结构:
      
        typedef enum {Tree, Bug} Species;
        typedef enum {Big_tree, Acorn, Seedling} Tree_forms;
        typedef enum {Caterpillar, Cocoon, Butterfly}
                      Bug_forms;
      
        struct thing {
          Species it;
          union {
            Tree_forms tree;
            Bug_forms bug;
          } form;
        };
      
        struct thing foo = {Tree, {Acorn}};

        当打开这个开关时,执行 p foo 命令后,会如下显示:
            $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}
      
        当关闭这个开关时,执行 p foo 命令后,会如下显示:
            $1 = {it = Tree, form = {...}}

    show print union
        查看联合体数据的显示方式
      
    set print object <on/off>
        在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB就不管虚函数表了。这个选项默认是off。
  
    show print object
        查看对象选项的设置。
      
    set print static-members <on/off>
        这个选项表示,当显示一个C++对象中的内容是,是否显示其中的静态数据成员。默认是on。
  
    show print static-members
        查看静态数据成员选项设置。
      
    set print vtbl <on/off>
        当此选项打开时,GDB将用比较规整的格式来显示虚函数表时。其默认是关闭的。
      
    show print vtbl
        查看虚函数显示格式的选项。
      
      
八、历史记录

    当你用GDB的print查看程序运行时的数据时,你每一个print都会被GDB记录下来。GDB会以$1, $2, $3 .....这样的方式为你每一个print命令编上号。于是,你可以使用这个编号访问以前的表达式,如$1。这个功能所带来的好处是,如果你先前输入了一个比较长的表达式,如果你还想查看这个表达式的值,你可以使用历史记录来访问,省去了重复输入。
  
  
九、GDB环境变量

    你可以在GDB的调试环境中定义自己的变量,用来保存一些调试程序中的运行数据。要定义一个GDB的变量很简单只需。使用GDB的set命令。GDB的环境变量和UNIX一样,也是以$起头。如:
  
    set $foo = *object_ptr
  
    使用环境变量时,GDB会在你第一次使用时创建这个变量,而在以后的使用中,则直接对其賦值。环境变量没有类型,你可以给环境变量定义任一的类型。包括结构体和数组。
  
    show convenience
        该命令查看当前所设置的所有的环境变量。
      
    这是一个比较强大的功能,环境变量和程序变量的交互使用,将使得程序调试更为灵活便捷。例如:
  
        set $i = 0
        print bar[$i++]->contents
  
    于是,当你就不必,print bar[0]->contents, print bar[1]->contents地输入命令了。输入这样的命令后,只用敲回车,重复执行上一条语句,环境变量会自动累加,从而完成逐个输出的功能。
  
  
十、查看寄存器

    要查看寄存器的值,很简单,可以使用如下命令:
  
    info registers
        查看寄存器的情况。(除了浮点寄存器)
  
    info all-registers
        查看所有寄存器的情况。(包括浮点寄存器)
  
    info registers <regname ...>
        查看所指定的寄存器的情况。
      
    寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了。如:p $eip。
   
改变程序的执行
———————

    一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的程序,比如,你可以在程序的一次运行中走遍程序的所有分支。
  
  
一、修改变量值

    修改被调试程序运行时的变量值,在GDB中很容易实现,使用GDB的print命令即可完成。如:
  
        (gdb) print x=4
  
    x=4这个表达式是C/C++的语法,意为把变量x的值修改为4,如果你当前调试的语言是Pascal,那么你可以使用Pascal的语法:x:=4。
  
    在某些时候,很有可能你的变量和GDB中的参数冲突,如:
  
        (gdb) whatis width
        type = double
        (gdb) p width
        $4 = 13
        (gdb) set width=47
        Invalid syntax in expression.

    因为,set width是GDB的命令,所以,出现了“Invalid syntax in expression”的设置错误,此时,你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如:
  
        (gdb) set var width=47
      
    另外,还可能有些情况,GDB并不报告这种错误,所以保险起见,在你改变程序变量取值时,最好都使用set var格式的GDB命令。
  

二、跳转执行

    一般来说,被调试程序会按照程序代码的运行顺序依次执行。GDB提供了乱序执行的功能,也就是说,GDB可以修改程序的执行顺序,可以让程序执行随意跳跃。这个功能可以由GDB的jump命令来完:
  
    jump <linespec>
    指定下一条语句的运行点。<linespce>可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表式着下一条运行语句从哪里开始。
  
    jump <address>
    这里的<address>是代码行的内存地址。
  
    注意,jump命令不会改变当前的程序栈中的内容,所以,当你从一个函数跳到另一个函数时,当函数运行完返回时进行弹栈操作时必然会发生错误,可能结果还是非常奇怪的,甚至于产生程序Core Dump。所以最好是同一个函数中进行跳转。
  
    熟悉汇编的人都知道,程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。如:
  
    set $pc = 0x485


三、产生信号量

    使用singal命令,可以产生一个信号量给被调试的程序。如:中断信号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产生信号非常有利程序的调试。
  
    语法是:signal <singal>,UNIX的系统信号量通常从1到15。所以<singal>取值也在这个范围。
  
    single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。
  

四、强制函数返回

    如果你的调试断点在某个函数中,并还有语句没有执行完。你可以使用return命令强制函数忽略还没有执行的语句并返回。
  
    return
    return <expression>
    使用return命令取消当前函数的执行,并立即返回,如果指定了<expression>,那么该表达式的值会被认作函数的返回值。
  
  
五、强制调用函数

    call <expr>
    表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。
  
    另一个相似的命令也可以完成这一功能——print,print后面可以跟表达式,所以也可以用他来调用函数,print和call的不同是,如果函数返回void,call则不显示,print则显示函数返回值,并把该值存入历史数据中。



在不同语言中使用GDB
——————————

GDB支持下列语言:C, C++, Fortran, PASCAL, Java, Chill, assembly, 和 Modula-2。一般说来,GDB会根据你所调试的程序来确定当然的调试语言,比如:发现文件名后缀为“.c”的,GDB会认为是C程序。文件名后缀为“.C, .cc, .cp, .cpp, .cxx, .c++”的,GDB会认为是C++程序。而后缀是“.f, .F”的,GDB会认为是Fortran程序,还有,后缀为如果是“.s, .S”的会认为是汇编语言。

也就是说,GDB会根据你所调试的程序的语言,来设置自己的语言环境,并让GDB的命令跟着语言环境的改变而改变。比如一些GDB命令需要用到表达式或变量时,这些表达式或变量的语法,完全是根据当前的语言环境而改变的。例如C/C++中对指针的语法是*p,而在Modula-2中则是p^。并且,如果你当前的程序是由几种不同语言一同编译成的,那到在调试过程中,GDB也能根据不同的语言自动地切换语言环境。这种跟着语言环境而改变的功能,真是体贴开发人员的一种设计。


下面是几个相关于GDB语言环境的命令:

    show language
        查看当前的语言环境。如果GDB不能识为你所调试的编程语言,那么,C语言被认为是默认的环境。
      
    info frame
        查看当前函数的程序语言。
      
    info source
        查看当前文件的程序语言。
  
如果GDB没有检测出当前的程序语言,那么你也可以手动设置当前的程序语言。使用set language命令即可做到。

    当set language命令后什么也不跟的话,你可以查看GDB所支持的语言种类:
  
        (gdb) set language
        The currently understood settings are:
      
        local or auto    Automatic setting based on source file
        c                Use the C language
        c++              Use the C++ language
        asm              Use the Asm language
        chill            Use the Chill language
        fortran          Use the Fortran language
        java             Use the Java language
        modula-2         Use the Modula-2 language
        pascal           Use the Pascal language
        scheme           Use the Scheme language
      
    于是你可以在set language后跟上被列出来的程序语言名,来设置当前的语言环境。
分享到:
评论

相关推荐

    gdb 快速入门中文教程

    GDB调试器使用手册(四) ............................................................................................... 12 退出gdb .......................................................................

    GDB调试工具教程

    GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以...

    VisualGDB5.2R8破解补丁资源分0

    VisualGDB的最新补丁(至2017年4月)

    基于FME实现的地理数据库建库工具,gdb批量建库工具,mdb批量建库工具,shp批量建库工具,自动建库,mdb建库,gdb建库

    2.支持gdb、mdb、shapefile格式的标准数据库建库 3.实现字段长度、字段别名、字段类型、图层别名、图层类型、要素集、坐标系的设置。 4.支持点、线、面、文本、表等图层 5.工具的实现过程无需写出读取临时表,更加...

    linuxc/c++GDB教程详解

    一般来说,GDB主要帮忙你完成下面四个方面的功能:从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但...

    Qt Creator2.8+编译器gcc440+调试器gdb7.4

    资源包含了Qt Creator2.8安装包,编译器gcc440包和调试器gdb7.4.包,内附Qt opensource 4.8.5下载地址。opensource需单独下载,以上四个文件可完成Qt Windows配置。教程及配置测试实例可参考博客。

    使用OSGeo4W用postGIS导入gdb数据库之OSGeo4W安装包及安装教程

    共4个文件,这个是osgeo4w软件及安装说明,其他3个是本地安装用文件

    Node_webkit_GDB:GNU C调试器GDB的用户界面

    Node_webkit_GDB GNU C调试器GDB的用户界面。 ###最后工作 fef0800bcd3bddb03fffc77e104906a4e562fd88 ###先决条件 海湾合作委员会 gdb 全局安装的nodewebkit(现在称为nw) ... 您可以按照 教程进行操作。

    GCC使用教程.pdf

    3. gdb 使用 4. gcc 常用选项对代码的影响 1. 一般情况 2. -O 编译选项 3. -O2 编译选项 4. -fomit-frame-pointer 编译选项 5. -fomit-frame-pointer && -O2 6. -fPIC 编译选项 7. -static 编译选项 5. AT&T 的汇编...

    Qt高级开发视频教程-QT视频教程下载

    2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整...

    经典GCC_使用教程

    3. gdb使用 4. gcc常用选项对代码的影响 1. 一般情况 2. -O 编译选项 3. -O2 编译选项 4. -fomit-frame-pointer 编译选项 5. -fomit-frame-pointer && -O2 6. -fPIC 编译选项 7. -static 编译选项 5. AT&T...

    嵌入式Linux应用程序开发标准教程(第2版全)

    第4章 嵌入式系统基础 4.1 嵌入式系统概述 4.1.1 嵌入式系统简介 4.1.2 嵌入式系统发展历史 4.1.3 嵌入式系统的特点 4.1.4 嵌入式系统的体系结构 4.1.5 几种主流嵌入式操作系统分析 4.2 ARM处理器硬件开发平台 4.2.1...

    mini2440国嵌视频教程+课件+工具+软件+镜像+教程源码下载地址

    -国嵌应用班-1-2(GDB程序调试).avi -国嵌应用班-1-3(makefile工程管理).avi -国嵌应用班-1-4(必修实验).avi -第2天(文件时间编程) -国嵌应用班-2-1(系统调用方式访问文件).avi -国嵌应用班-2-2(库函数...

    国嵌嵌入式LINUX视频教程LINUX应用开发班共22讲.txt

    1-2(gdb程序调试! 1-3(nakefile工程管理) 2-1(系统调用方式访问文件) 2-2(库函数访问文件) 2-3(时间编程) 3-1(进程控制原理) 3-2(进程控制程序设计) 4-1(进程间通讯概述) 4-2(管道通讯) 4-3(信号通讯) 4-4(共享内存...

    ubuntu20.04+Qt5.12.12+aarch64-linux-gnu交叉编译平台设置详细教程

    填平了无数大坑后终于实现ubuntu20.04+Qt5.12.12+aarch64-linux-gnu交叉编译平台设置。详细记录了安装的全部过程,补充了全部所需的库,整个编译过程中无任何错误报出,亲测可用。

    SOPC 系统设计入门教程

    SOPC ,系统设计入门教程 前言 目录 第一章 概述 1.1 SOPC 的概念 1.2 SOPC 系统设计流程 1.2.1 SOPC Builder 的设计流程 1.2.2 SOPC Builder 的设计阶段 1.2.3 SOPC 系统开发流程 1.3 SOPC 系统...

    linux从零基础系统编程开始视频教程.zip

    Day3 (makefile、、gdb调试工具、open函数) Day4 (文件IO、阻塞非阻塞、目录函数) Day5 (递归遍历目录、dup2、进程) Day6 (进程、进程控制、管道) Day7 (进程间通信) Day8 (信号、信号捕捉) Day9 (守护...

    Linux详细教程和用户接口(GUI)编程技术

    第一部分介绍Linux GUI编程架构以及编程基础知识,第二部分介绍Linux 编程常用C语言函数库glibc、构件库Gtk+、Gnome,第三部分介绍Linux下的GUI生成器Glade,第四部分介绍Linux编程调试工具gdb及xxgdb。第五部分包括...

    Linux学习笔记Linux学习资料Linux教程

    【linux学习笔记-1】使用GDB调试简单的用户程序.doc 【linux学习笔记-2】父子进程共享文件描述符.doc 【linux学习笔记-3】文件操作(stat,chmod,umask).doc 【linux学习笔记-4】进程扇和进程链.doc 【linux学习笔记-...

Global site tag (gtag.js) - Google Analytics