GDB 常用命令

GDB 常用命令

原文为《计算机系统基础》附录C,ISBN 号为 978-7-111-60489-1

我的博客

GDB 是一个程序调试工具软件,GDB 具有类似 shell 的命令补全功能。

启动 GDB

shell 命令行中输入 gdb 命令启动 GDB 程序,比如假设 shell 提示符为 $:

$ gdb [可执行文件名]

该命令用于启动 GDB 并同时加载指定的将要被调试的可执行文件,如果仅输入 gdb,而没有给定可执行文件,则仅启动 GDB 程序,因此需要在 GDB 环境中使用命令加载需要调试的可执行文件。

一旦启动 GDB 程序,则调试过程就在 GDB 调试环境中进行。

GDB 常用命令

GDB 调试环境中,大部分 GDB 命令可以利用补全功能以简写方式输入,比如 quit 可以写为 q,因为在 GDB 中,以 q 开头的命令只有 quitlist 可以简写为 l;此外,按下回车键,会重复上一个命令。

GDB 调试环境下使用的 GDB 命令有很多,下面是常用的几个:

  • help [命令名]

    如果想了解某个 GDB 命令的用法,可以使用 help 命令,比如列出 list 命令的使用方法:

    (gdb) help list
    List specified function or line.
    With no argument, lists ten more lines after or around previous listing.
    "list -" lists the ten lines before a previous ten-line listing.
    One argument specifies a line, and ten lines are listed around that line.
    Two arguments with comma between specify starting and ending lines to list.
    Lines can be specified in these ways:
      LINENUM, to list around that line in current file,
      FILE:LINENUM, to list around that line in that file,
      FUNCTION, to list around beginning of that function,
      FILE:FUNCTION, to distinguish among like-named static functions.
      *ADDRESS, to list around the line containing that address.
    With two args, if one is empty, it stands for ten lines away from
    the other arg.
    
    By default, when a single location is given, display ten lines.
    This can be changed using "set listsize", and the current value
    can be shown using "show listsize".
    
  • file <可执行文件>

    如果在启动 GDB 程序时忘了加可执行文件名,那么在调试环境下,可以使用 file 命令指定需要加载并调试的可执行文件。比如:

    (gdb) file ./a.out
    

    将加载当前目录下的 a.out 文件。

  • run [参数列表]

    run 命令用来启动并运行已经加载的被调试程序,如果被调试程序需要参数,则在 run 后面跟着输入参数列表,参数之间使用空格做间隔。

  • list [显示对象]

    list 程序用来显示一段源程序代码,在 list 后面指定显示对象的参数通常有一下几种:

    • <linenum>

      行号,显示对象为指定行号前、后若干行源码

    • <+offset>

      相对当前行的正偏移量,显示对象为当前行的后面若干行源码

    • <-offset>

      相对当前行的负偏移量,显示对象为当前行的前面若干行源码

    • <filename: linenum>

      显示对象为指定文件中指定行号前、后若干行源码

    • <function>

      函数名,显示对象为指定函数的源码

    • <filename: function>

      显示对象为指定文件中指定函数的源码

    • <*address>

      地址,显示指定地址处的源码

  • break [需设置的断点]

    break 命令用来对被调试程序设置断点,在 break 后面的参数通常有下面几种:

    • <linenum>

      行号,在当前源文件中的指定行处设置断点

    • <filename: linenum>

      在指定文件的指定行处设置断点

    • <function>

      函数名,在指定函数的入口处设置断点

    • <filename: function>

      在指定文件中指定函数的入口处设置断点

    • <*address>

      地址,在指定地址处设置断点

    • <condition>

      条件,只有在某些特定的条件成立时程序才会停下,称为条件断点

      设置一个断点之后,它的起始状态是有效。可以使用 enabledisable 来使某个断点有效或无效,也可以用 delete 命令来删除某个断点。比如,使用命令 delete 2 命令将 2 号断点删除

  • info br [source] stack [args]...

    info 命令用来查看被调试程序的信息,其参数非常多,大部分不常用。其中,info br 查看设置的所有断点的详细信息,包括断点号、类型、状态、内存地址、断点在源程序中的位置等;info source 查看当前源程序;info stack 查看栈信息,它反映了过程 (函数) 之间的调用层次关系;info args 查看当前参数信息

  • watch <表达式>

    watch 命令用来观察某个表达式或变量的值是否被修改,一旦被修改则暂停程序执行

  • print <表达式>

    print 命令用来显示表达式的值,表达式中的变量必须是全局变量或当前栈区可见的变量。否则 GDB 会显示类似下面的信息:

    No symbol "xxxxxx" in current context
    
  • x/NFU address

    x 命令用来检查内存单元的值,xexamine 的意思。其中 N 代表重复数,F 代表输出格式,U 代表每个数据单位的大小,上述命令表示从地址 address 开始以 F 格式显示 N 个大小为 U 的数值。若不指定 N,则默 N1;若不指定 U,则默认每个数据单元为 4 个字节。F 的取值可以是 x(十六进制整数)d(带符号十进制整数)u(无符号十进制整数)f(浮点数)U 可以取 b(字节)h(双字节)w(四字节)g(八字节)。比如命令 x/8ub 0x80490000 表示以无符号十进制整数格式显示 8 字节数据信息

  • step

    跟踪进入到一个函数的内部

  • next

    继续执行下一条语句,若当前语句中包含函数调用,则不会进入函数内部,而是完成对当前语句中的函数调用后跟踪到下一条语句

  • continue

    程序在断点处暂停执行后,使用 continue 令程序继续执行下去

  • quit

    退出 GDB

posted @ 2022-06-30 23:09  ArvinDu  阅读(211)  评论(0编辑  收藏  举报