gdb常用命令

产生调试信息

g++/gcc:

使用-g选项

使用-O0选项去除优化

makefile

使用-g选项

使用-O0选项去除优化

CMakeLists.txt

添加SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")

总览 

  • b —— break,在指定的行或函数处设置断点
  • ib —— info breakpoints,打印未删除的所有断点,观察点和捕获点的列表
  • dis —— disable,禁用断点
  • enable —— 启用断点
  • clear —— 清除指定行或函数处的断点
  • d —— delete, 删除断点
  • tbreak —— 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
  • watch —— 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行
  • s —— step,单步跟踪,如果有函数调用,会进入该函数
  • reverse-step —— 反向单步跟踪,如果有函数调用,会进入该函数
  • n —— next,单步跟踪,如果有函数调用,不会进入该函数
  • reverse-next —— 反向单步跟踪,如果有函数调用,不会进入该函数
  • return —— 使选定的栈帧返回到其调用者
  • fin ——  finish,执行直到选择的栈帧返回
  • u ——  until, 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用)
  • c —— continue,恢复程序执行
  • p —— print, 打印表达式 EXP 的值
  • x —— 查看内存
  • display —— 每次程序停止时打印表达式 EXP 的值(自动显示)
  • info display —— 打印早先设置为自动显示的表达式列表
  • disable display —— 禁用自动显示
  • enable display —— 启用自动显示
  • undisplay —— 删除自动显示项
  • h —— help,打印命令列表(带参数时查找命令的帮助)
  • attach —— 挂接到已在运行的进程来调试
  • r —— run, 启动被调试的程序
  • bt —— backtrace,查看程序调用栈的信息
  • ptype — 打印类型 TYPE 的定义
  • set —— 更改变量
  • info —— 查看信息

命令详解

  • b —— break,在指定的行或函数处设置断点
    • break 当不带参数时,在所选栈帧中执行的下一条指令处设置断点。
    • break <function-name> 在函数体入口处打断点,在 C++ 中可以使用 class::function 或 function(type, ...) 格式来指定函数名。
    • break <line-number> 在当前源码文件指定行的开始处打断点。
    • break -Nbreak +N 在当前源码行前面或后面的 N 行开始处打断点,N 为正整数。
    • break <filename:linenum>  在源码文件 filename 的 linenum 行处打断点。
    • break <filename:function>  在源码文件 filename 的 function 函数入口处打断点。
    • break <address> 在程序指令的地址处打断点。
    • break ... if <cond>  设置条件断点,... 代表上述参数之一(或无参数),cond为条件表达式,仅在 cond 值非零时暂停程序执行。
  • ib —— info breakpoints,打印未删除的所有断点,观察点和捕获点的列表
    • info breakpoints [list...]
    • info break [list...]
    • list... 用来指定若干个断点的编号(可省略),可以是 2, 1-3, 2 5 等。
  • dis —— disable,禁用断点

禁用一些断点。参数是用空格分隔的断点编号。要禁用所有断点,不加参数。

禁用的断点不会被忘记,但直到重新启用才有效。

    • disable [breakpoints] [list...]
    • breakpoints 是 disable 的子命令(可省略),list... 同 info breakpoints 中的描述。
  • enable —— 启用断点
      启用一些断点。给出断点编号(以空格分隔)作为参数。没有参数时,所有断点被启用。
    • enable [breakpoints] [list...] 启用指定的断点(或所有定义的断点)。
    • enable [breakpoints] once list... 临时启用指定的断点。GDB 在停止您的程序后立即禁用这些断点。
    • enable [breakpoints] delete list... 使指定的断点启用一次,然后删除。一旦您的程序停止,GDB 就会删除这些断点。等效于用 tbreak 设置的断点。
  • clear —— 清除指定行或函数处的断点

在指定行或函数处清除断点。参数可以是行号,函数名称或 * 跟一个地址。

clear 当不带参数时,清除所选栈帧在执行的源码行中的所有断点。

    • clear <function>clear <filename:function>  删除在命名函数的入口处设置的任何断点。
    • clear <linenum>clear <filename:linenum>  删除在指定的文件指定的行号的代码中设置的任何断点。
    • clear <address> 清除指定程序指令的地址处的断点。
  • d —— delete, 删除断点

删除一些断点或自动显示表达式。参数是用空格分隔的断点编号。要删除所有断点,不加参数。

    • delete [breakpoints] [list...]
  • tbreak —— 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
  • watch —— 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行

为表达式设置观察点。

    • watch [-l|-location] <expr>  每当一个表达式的值改变时,观察点就会暂停程序执行。

如果给出了 -l 或者 -location,则它会对 expr 求值并观察它所指向的内存。例如,watch *(int *)0x12345678 将在指定的地址处观察一个 4 字节的区域(假设 int 占用 4 个字节)。

 

  • s —— step,单步跟踪,如果有函数调用,会进入该函数
    • step [N] 参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。
  • reverse-step —— 反向单步跟踪,如果有函数调用,会进入该函数
    • reverse-step [N] 参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。
  • n —— next,单步跟踪,如果有函数调用,不会进入该函数
    • next [N]
  • reverse-next —— 反向单步跟踪,如果有函数调用,不会进入该函数
    • reverse-next [N]
  • return —— 使选定的栈帧返回到其调用者
    • return <expression>  将 expression 的值作为函数的返回值并使函数直接返回。
  • fin ——  finish,执行直到选择的栈帧返回
  • u ——  until, 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用)
    • until <location>  或 u <location>  继续运行程序,直到达到指定的位置,或者当前栈帧返回。
  • c —— continue,恢复程序执行
    • continue [N] 如果从断点开始,可以使用数字 N 作为参数,这意味着将该断点的忽略计数设置为 N - 1(以便断点在第 N 次到达之前不会中断)。
  • p —— print, 打印表达式 EXP 的值
    • print [expr] 或 print /f [expr]expr 是一个(在源代码语言中的)表达式。

默认情况下,expr 的值以适合其数据类型的格式打印;您可以通过指定 /f 来选择不同的格式,其中 f 是一个指定格式的字母;详见输出格式

如果省略 expr,GDB 再次显示最后一个值。

要以每行一个成员带缩进的格式打印结构体变量请使用命令 set print pretty on,取消则使用命令 set print pretty off

可使用命令 show print 查看所有打印的设置。

 

  • x —— 查看内存
    • x/nfu <addr>  或 x <addr> nf 和 u 都是可选参数,用于指定要显示的内存以及如何格式化。addr 是要开始显示内存的地址的表达式。

      n 重复次数(默认值是 1),指定要显示多少个单位(由 u 指定)的内存值。

      f 显示格式(初始默认值是 x),显示格式是 print('x','d','u','o','t','a','c','f','s') 使用的格式之一,再加 i(机器指令)。

      u 单位大小,b 表示单字节,h 表示双字节,w 表示四字节,g 表示八字节。

      例如:

      x/3uh 0x54320 表示从地址 0x54320 开始以无符号十进制整数的格式,双字节为单位来显示 3 个内存值。

      x/16xb 0x7f95b7d18870 表示从地址 0x7f95b7d18870 开始以十六进制整数的格式,单字节为单位显示 16 个内存值。

  • display —— 每次程序停止时打印表达式 EXP 的值(自动显示)
    • display <expr>,  display/fmt <expr>  或 display/fmt <addr> fmt 用于指定显示格式。像 print 命令里的 /f 一样。

      对于格式 i 或 s,或者包括单位大小或单位数量,将表达式 addr 添加为每次程序停止时要检查的内存地址。

  • info display —— 打印早先设置为自动显示的表达式列表
  • disable display —— 禁用自动显示
  • enable display —— 启用自动显示
  • undisplay —— 删除自动显示项
  • h —— help,打印命令列表(带参数时查找命令的帮助)
  • r —— run, 启动被调试的程序
    • 可以直接指定参数,也可以用 set args 设置(启动所需的)参数。

      例如: run arg1 arg2 ... 等效于

  

set args arg1 arg2 ...
run
  • bt —— backtrace,查看程序调用栈的信息
    • bt 打印整体栈帧信息,每个栈帧一行。
    • bt n 类似于上,但只打印最内层的 n 个栈帧。
    • bt -n 类似于上,但只打印最外层的 n 个栈帧。
    • bt full n 类似于 bt n,还打印局部变量的值。
    • where 和 info stack(缩写 info s) 是 backtrace 的别名
  • ptype — 打印类型 TYPE 的定义
    • 打印类型 TYPE 的定义。

      用法: ptype[/FLAGS] TYPE-NAME | EXPRESSION

      参数可以是由 typedef 定义的类型名, 或者 struct STRUCT-TAG 或者 class CLASS-NAME 或者 union UNION-TAG 或者 enum ENUM-TAG

      根据所选的栈帧的词法上下文来查找该名字。

      类似的命令是 whatis,区别在于 whatis 不展开由 typedef 定义的数据类型,而 ptype 会展开。

  • list —— 显示行号
    • list [filename] 查看文件内容

    • list [linenum] 查看某一行内容

    • list [linenum] [linenum] 查看某些行范围的内容

    • list [functionname] 查看某个函数内容

    • list 显示断点处程序

  • set —— 更改变量
    (gdb) set var a=0.0
    (gdb) set var array_a={0.0, 0.0, 1.0, 1.0
  • info —— 查看信息
    •  info local :查看所有的局部变量
    •  info stack:查看此时的栈状态
    •  info args:打印出当前函数的参数名及其值
    • info catch:打印出当前的函数中的异常处理信息。
    • info line:查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函
      数名”,这个命令会打印出所指定的源码在运行时的内存地址
    • info break: 查看断点信息。
    • info threads:看正在运行程序中的线程信息
    • info registers:查看寄存器的情况。(除了浮点寄存器)
    • info all-registers:查看所有寄存器的情况。(包括浮点寄存器)
    • info registers <regname>:查看所指定的寄存器的情况。

例子

http://blog.jobbole.com/107925/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

http://blog.jobbole.com/107759/

参考

http://blog.jobbole.com/112547/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

原文地址:https://www.cnblogs.com/freedomabcd/p/7771052.html