gdb

GNU程序调试器


语法格式

gdb [-fnq] [-b bps] [-c core] [-d dir] [-e prog] [-p pid] [-s symfile]
        [-x cmds] [gnu-opts] [prog[core|pid]]
gdb [-h|-help] [-version]

命令简介

gdb命令用于调试采用C、C++或Fortran等语言编写的程序,考察程序内部的执行状况等,找出程序问题的原因。其中,progcorepid分别表示可执行代码文件、内存映像文件(core)或进程ID。第一个参数等价于指定了“-se”选项,第二个参数等价于指定了“-c”选项。

gdb提供大量的内部命令,可以控制程序的运行,考察程序断点的现场,显示调用栈的内容,对内存中的机器指令进行反汇编,修改变量与数据,观察程序的执行结果等。

在开发阶段,当编写的程序有可能需要调试时,编译时应有意识地增加调试信息,如在编译C程序时增加“-g”选项。

运行gdb命令时,可以直接指定一个程序名,从而调试指定的程序:

$ gdb prog

当程序在运行过程中产生内存映像文件时,可以使用下列形式运行gdb命令:

$ gdb prog core

也可以使用进程ID作为第二个参数,直接调试当前正在运行的进程:

$ gdb prog 1234

命令选项

-b bps  设置利用gdb进行远程调试时所用串口的通信速度(波特率)。

-c file, -core=file  使用指定的文件作为内存映像文件考察。

-d dir, -directory=dir  把指定的目录加到源文件检索路径。

-e file, -exec=file  使用指定的文件file作为可执行文件,在适当的时候开始执行,连同内存映像文件一起考察纯数据。

-f, -fullname  当作为一个子进程运行emacs时,由emacs设置这个选项。令gdb在每次显示栈帧(或每次程序停止运行)时以标准的方式输出完整的文件名与行号。

-h, -help  显示命令的概要说明、语法格式、所有的命令选项及其简单介绍等帮助信息。

-n, -nx  禁止执行任何“.gdbinit”初始化文件中的命令。通常,在处理完所有的命令行选项与参数之后,gdb会执行上述初始化文件中的命令。

-p pid, -pid pid  连接到指定进程ID的进程,考察指定的进程。类似于attach内部命令。

-q, -quiet  安静运行模式。禁止显示命令说明及版权信息等。

-s file, -symbols=file  从指定的文件中读取符号表。

-x file, -command=file  执行指定文件中的gdb命令。

-batch  批处理运行模式。在处理完“-x”选项指定的所有命令文件和“.gdbinit”文件(如果未禁止)之后,终止运行,返回0。如果在执行其中的任何gdb命令期间出现错误,终止运行,返回非零的结束状态。

-cd=dir  使用指定的目录(而非当前目录)作为工作目录,运行gdb。

-se=file  从指定的文件file中读取符号表,并使用该文件作为可执行文件。

-statistics  在完成每个命令并返回gdb提示之后,显示时间与内存使用情况的统计信息。

-tty=device  使用指定的设备作为运行gdb时的标准输入和标准输出。

-write  以读写方式打开程序文件或内存映像文件。

内部命令

attach pid  调试当前正在运行的进程,其中pid是进程的PID。

break [location]  在指定的位置设置断点。位置location可以是一个函数名、源代码的行号、相对于当前行的偏移值或指令地址等。设置的断点用于停止程序的运行。在程序执行到设定的断点位置之前,停止程序的运行,把控制权交还gdb。如果未指定位置,意味着把选定调用栈函数帧中即将执行的下一个指令设置作为断点。

bt, backtrace [full] [n]  跟踪程序调用栈,显示其中的指定函数帧(函数调用现场),或者是从当前函数帧(编号0)开始的所有函数帧。如果指定的数字n为负数,显示从最外层开始计数的第n个函数帧。使用“full”限定符还可以显示本地变量的值。

c, continue [ignores]  在程序最近停止运行的位置恢复程序的运行。即使存在,也会绕过在该地址处设置的任何断点。选用的参数ignores允许用户指定忽略该位置断点的次数。注意,仅当程序由于遇到断点停止运行时重复计数ignores才有意义。

catch event  当指定的事件出现时停止程序的运行。事件可以是exec、fork和syscall等任何系统调用。

cd  设置gdb与待调试程序的工作目录。

clear [location]  删除在指定位置处设置的任何断点。位置location可以是一个函数名、行号或指令地址等。如果未指定位置,意味着删除选定调用栈函数帧中即将执行的下一个指令处的断点。

d, delete [breakpoints] [ranges]  删除指定断点范围内的断点、观察点(表达式的值发生变化)或捕捉点(当系统调用等事件出现或C++抛出异常)。如果未指定断点或范围参数,删除所有的断点。

d, delete tracepoint [num]  永久地删除指定的一个或多个跟踪点。如果未指定参数,默认的动作是删除所有的跟踪点。

detach  释放调试的进程。

disassemble args  显示一定内存范围的机器指令,反汇编成汇编代码,或使用“/m”限定符显示源代码与汇编代码的混合代码,使用“/r”限定符显示十六进制数值与符号名代码。默认的内存范围是选定数据帧中围绕程序计数器的函数部分。其中参数args可以是数值或函数名。如果参数args是一个数值,表示程序计数器的值,意味着反汇编围绕着该数值的函数。如果给定两个数值参数(中间加逗号或空白字符分隔符),表示反汇编指定地址范围内的代码,同时给出代码所在函数的名字。实际上,参数args可以是任何数值表达式,如“0x32c4”、“&main+10”或“$pc - 8”等。

down [n]  向调用栈的内层跳转n个数据帧。n的默认值是1。

edit location  编辑源程序指定位置的源代码,其中location可以是表示代码行的行号或函数名等。

frame [n] [addr]  用于选择需要考察的调用栈的函数帧(函数调用现场)。如果未指定任何参数,显示调用栈的当前帧,否则显示指定层次或地址的函数帧的简单 描述。

gcore [file]  令当前运行的进程或调试的程序生成内存映像文件。选用的参数file用于存储转储的内存映像文件。如果未指定文件参数,默认的文件名是core.pid,其中pid是调试的程序或进程的PID。

h, help [name]  显示指定命令的说明信息。如果未指定具体的命令名,显示gdb命令的分类及其说明信息。

i, info  查询当前调试的程序的信息,如使用“info program”命令查询程序的运行状态,使用“info stack”命令查询调用栈的信息,使用“info frame”命令查询函数帧的信息,使用“info args”命令查询传递给函数的参数,使用“info functions”命令查询程序中的函数信息,使用“info registers”查询当前使用的寄存器,以及使用“info breakpoints”命令查询当前设置的断 点等。

l, list [location]  显示当前或指定位置前后的部分源代码(通常为10行)。其中location可以是源代码的行号、行号范围或函数名等。如果指定了行号,显示该行号前后的部分源代码。如果指定了函数名,显示围绕该函数的部分源代码。

n, next [count]  在停止运行之后,继续执行调用栈当前帧(最内层的函数帧)的下一行源代码。如果源代码行中存在函数调用,不停顿地继续执行。当执行到调用栈当前帧内的不同代码行时停止运行,而且仅在第一个源代码的第一个指令处停止运行。选用的参数count是一个重复计数,表示重复执行指定次数的next命令。

print [/F] [expr]  显示源代码表达式的计算结果。“/F”表示输出格式。如果未指定输出格式,gdb将按照适当的数据类型输出表达式的计算结果。如果忽略了表达式,意味着再次输出最近的计算结果。

pwd  显示gdb的工作目录。

q, quit  退出gdb。

r, run cmd [args]  在gdb的控制下,使用给定的参数(如果需要)运行指定的程序。

reverse-search regexp  从之前显示的最后一行的前一行开始,逐行反向检索匹配指定正则表达式的代码行。如果存在,显示匹配的代码行。

search regexp  从之前显示的最后一行的下一行开始,逐行正向检索匹配指定正则表达式的代码行。如果存在,显示匹配的代码行。

set  用于设置环境变量,以及设置gdb的处理模式等。

shell cmd args  在gdb中临时执行指定的Shell命令。

show  查询gdb本身的信息,如查询gdb的运行状态,显示可设置的参数及参数的当前设置等。例如,“show args”命令用于查询运行程序时提供的参数。

s, step [count]  继续运行程序直至执行到另一行源代码时停止运行,把控制权交还gdb。step命令仅停止在源代码行的第一条指令处。如果源代码行中存在具有调试信息的函数调用,step命令也会继续停止运行。仅当函数存在行号信息时,step才会进入函数,否则其处理动作类似于next命令。选用的参数count是一个重复计数,表示重复执行指定次数的step命令。如果在运行指定次数的step命令之前执行到断点位置,或收到某个信号,则立即执行step命令。

trace location  类似于break命令,用于定义一个跟踪点,当执行到跟踪点时停止程序的运行,收集现场数据,之后可以继续运行。其位置参数location可以是一个函数名、源代码的行号、相对于当前行的偏移值或指令地址等。

up [n]  向调用栈的外层跳转n个数据帧。n的默认值是1。

x /NFU addr  按照指定的格式而非程序的数据类型考察内存数据。

应用实例

1. 在运行过程中,如果程序mf产生了内存映像文件,则可以使用gdb命令进行调试。

$ gdb mf core

2. 也可以运行gdb命令,直接调试指定的程序mf。

$ gdb mf

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z