GDB常用命令的用法

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要有以下四个功能:

  • 启动程序,可以按照工程师自定义的要求运行程序;
  • 让被调试的程序在工程师的指定的断点处停住,断点可以是条件表达式;
  • 当程序被停住时,可以检查此时程序中所发生的事,并追踪上文;

    下面就GDB常用的命令进行介绍:

    list命令

  • list < linenum >:显示程序第linenum行周围的源程序;

  • list < function >:显示函数名为function的函数的源程序;
  • list:显示当前行后面的源程序;
  • list -:显示当前行前面的源程序。

    run命令

    在GDB中,运行程序使用run命令,简写为r。在程序运行前,我们可以设置如下4个方面的工作环境。
    (1)程序运行参数:使用set args可指定运行时参数,如set args 10 20 30,用show args命令可查看设定的参数;
    (2)运行环境:用path < dir >可设定程序的运行路径,用show paths可查看程序的运行路径;用set environment varname[=value]可设置环境变量,如set env USER=myname;用show environment[varname]则可查看环境变量。
    (3)工作目录:cd < dir >相当于shell的cd命令,pwd可现实当前所在的目录;
    (4)程序的输入输出:info terminial用于显示程序用到的终端的模式;在GDB中可使用重定向程序输出,如run>outfile;用tty命令可以指定输入输出的终端设备,如/dev/ttyS1。

    break命令

    break命令的作用是设定置断点,简写为b,设置断点的方法如下:
    (1)b < function >:在进入函数时停住;
    (2)b < linenum >:在指定行号停住;
    (3)b +offset / b -offset:在当前行号的前面或者后面的offset行停住;
    (4)b filename:linenum:在源文件filename的linenum行停住;
    (5)b filename:function:在源文件filename的function函数的入口处停住;
    (6)b *address:在程序运行的内存地址处停住;
    (7)b:没有参数时,表示在下一条指令处停住;
    (8)b…if< condition >:…可以是上述的< linenum >,+offset / b -offset等参数,condition表示条件,在条件成立时停住,如break if i=100,表示当i=100时停住;
    查看断点使用info命令。

    单步命令

    next命令用于单步执行,但不进入函数内部,简写为n;step命令在单步执行一个函数时,进入函数内部,简写为s。
    (1)s < count >:单步跟踪,如果有函数调用,则进入该函数。count表示执行后面的count条指令然后停住;
    (2)n < count >:单步跟踪,如果有函数调用,不进入该函数。count表示执行后面的count条指令然后停住;
    (3)set step-mode:set step-mode on用于打开step-mode模式,在进行单步跟踪时,若跨越某没有调试信息的函数,程序的执行则会在该函数的第一条指令处停住,而不会跳过整个函数。这样我们可以查看该函数的机器指令;
    (4)finish:简写为fin。表示运行程序直到当前函数完成返回,并打印函数返回时的堆栈地址、返回值及参数值等信息;
    (5)until:简写为u。运行程序直到退出循环体;

    continue命令

    简写为c。表示当程序被停住后,可以使用c命令回复程序的运行直到程序结束,或者到达下一个断点。

    print命令

    简写为p。当程序被停住时,可使用p命令查看当前程序的运行数据,其格式为:
    p < expr >
    p /< f > < expr >
    其中:
    < expr >是变量或表达式。比如p sum表示查看变量sum的值,如果sum是静态数组名,则表示查看数组的元素值,p *array@100表示查看动态数组的值,array表示起始地址,100表示长度;
    < f >是输出的格式。支持的格式有:
    (1)x:十六进制;
    (2)d:十进制;
    (3)u:十六进制格式显示无符号整型;
    (4)o:八进制;
    (5)t:二进制;
    (6)c:字符格式;
    (7) f:浮点格式。

    watch命令

    watch命令一般用来观察某个表达式的值是否有了变化,如果有变化则马上停止程序的运行。使用方法如下:
    (1)watch < expr >:当表达式expr被读时停止程序运行;
    (2)awatch < expr >:当表达式的值被读或者被写时停止程序运行;
    (3)info watchpoints:列出当前所设置的所有观察点。

    examine命令

    简写为x。表示查看内存地址的值。其用法如下:
    x /< n/f/u > < addr >
    其中:
    < addr >:内存地址;
    n:一个正整数,表示显示内存的长度;
    f:表示显示的格式,如果地址所指定的是字符串,那么格式可以是s;
    u:表示从当前地址往后请求的字节数,不指定默认是4字节。b表示单字节,h表示双字节,w表示四字节,g表示八字节。
    例如:x /3uh 0x54320表示从内存地址0x54320开始以及双字节(h)为一个单位、16进制方式(u)显示3个单位(3)的内存。

    signal命令

    使用signal命令可以产生一个信号量给被调试的程序。可以在程序运行的任意位置处设置断点,并在该断点处用GDB产生一个信号量,这种精确地在某处产生信号的方法非常有利于程序的调试。其格式为
    signal < signal >
    其中
    < signal >:信号量,一般为1~15;

    disassemble命令

    disassemble命令用于反汇编,可用它来查看当前执行时的源代码的机器码,实际上只是把当前内存中的指令冲刷出来。

你可能感兴趣的:(Linux,GDB)