zoukankan      html  css  js  c++  java
  • GDB高级使用方法

    1、设置环境变量

      用户可以在GDB的调试环境中定义自己需要的变量,用来保存一些调试程序中的运行数据。要定义一个GDB的变量很简单,只需使用GDB的set命令。

      GDB的环境变量和Linux一样,也是以$起头。如:

      (gdb)set $foo=xxx

      使用环境变量时,GDB会在第一次使用时创建这个变量,而在以后的使用中,则直接对其赋值。环境变量没有类型,可以给环境变量定义任意的类型,包括结构体和数组。如果要查看当前的所有环境变量,可以输入:

      (gdb)show convenience

      正是由于环境变量和程序变量可以相互使用,使得程序调试更为灵活便捷。例如:

      (gdb)set $i=0

      (gdb)print bar[$i++]->contents

      于是,当用户要执行累加操作时,就不必print bar[0]->contents, print bar[1]->contents一条条地输入命令了。输入这样的命令后,只要回车,重复执行上一条语句,环境变量就会自动累加,从而完成逐个输出的功能。  

    2、设置显示选项

      GDB设置显示选项较多,在此只列举最常用的设置方法:

      (1)设置参数地址信息

      GDB具有支持是否显示参数地址信息的功能,用户可以设置其为打开或者关闭,格式如下:

      (gdb)set print address [on/off]

      查看当前参数地址设置情况可以使用命令:show print address

      (2)设置语言

      GDB支持C、C++、Fortran、Java等多种语言。

      GDB会根据调试语言的不同,自动设置不同的语言环境。用户当然自己也可为其设置语言环境,设置语言的格式如下:

      (gdb)set language [option]

      如果set language命令后面的option什么也不写,gdb将显示所支持的所有语言种类。

      要查看当前环境的程序语言,可以使用命令show language,如果gdb不能识别所调试的语言,那么c语言将被作为默认的环境。

      (3)设置数组  

      对于显示数组而言,如果打开数组显示,数组中每个元素都占用一行;如果关闭的话,每个元素都以逗号分开,这个选项默认是关闭的,它的格式如下:

      (gdb)set print array [on/off] 

    3、条件测试方法

      在GDB环境中,除了用户直接指定断点外,还存在一种通过判断条件满足与否自动设置断点的方法,即条件测试方法。

      条件测试方法提供条件测试来启动断点的功能,即在某些条件下触发断点或者启动某些任务,它的格式如下:

      (gdb)break 行号或函数 if condition 

    4、GDB与shell通信

      有时候运行一个调试程序,需要查看Linux系统的相关信息,如果此时退出GDB调试环境,势必影响程序开发进程。基于这个因素,GDB开发出可以与shell通信的交互机制,这样用户可以不用离开gdb调试环境,就可以直接查看shell程序的结果。GDB与shell通信的语法格式如下:

      (gdb)sehll <command>

      其中command表示用户即将要执行的shell命令 

    5、窗口观察功能

      当用户调试一个很大的程序,并且在跟踪一个关键的变量时,发现这个变量不知在哪里被改动过,那么如何才能快速定位修改它的地方呢?

      在GDB中使用watch命令,可以跟踪一个变量的变化。使用watch窗口观察功能和在程序中特定位置设置断点的功能类似,但两者还有区别,使用窗口观察法只有在表达式真正发生变化时,监测点才被触发。

    6、历史记录功能

      当用户使用GDB的print查看程序运行的数据时,每一个print都会被GDB记录下来,GDB会以$1,$2,$3,...的方式为每一个print命令编上号。于是,用户可以使用这个编号访问以前的表达式。

    7、改变程序执行

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

      (1)修改变量数值

        (gdb)print x=4

      (2)跳转执行

         (gdb)jump <行标>

      (3)强制函数返回

        (gdb)return  或者 return <expression>(expression表达式的值被认为是函数的返回值)

  • 相关阅读:
    「USACO 2020 US Open Platinum」Exercise
    Equilateral Triangles
    [USACO 2020 February Platinum]Help Yourself
    「ICPC World Finals 2019」美丽的桥梁
    「ICPC World Finals 2019 何以伊名始
    COCI20162017 Contest#6 F
    COCI2016/2017 Contest#3 F Meksikanac
    TopCoder SRM 570 Div1 CurvyonRails
    COCI2016-2017 Contest#2 F
    UOJ Round Good Bye JiHai D. 新年的追逐战
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3428275.html
Copyright © 2011-2022 走看看