产生调试信息
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 -N
break +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>
n
、f
和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