1.介绍
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助我们完成下面4个方面的功能:
- 1.启动程序,可以按照自定义的要求随心所欲的运行程序。
- 2.让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。
- 3.当程序被停住时,可以检查此时程序中所发生的事,并追索上文。
- 4.动态地改变程序的执行环境。
注意:利用gdb调试,需要在gcc编译过程中加上-g选项
,这样编译生成的可执行文件才可以利用gdb进行源码调试。-g 选项的作用是在可执行文件中加入源代码的信息
,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。如果把当前的gdb.c改名为g.c或者将gdb.c移动到其他地方,则gdb无法进行调试。
CMake编译时支持GDB调试:
修改CMakeLists.txt文件,如我修改如下:
# Version 2.4 might work, but it won't find static libraries with odd names
cmake_minimum_required(VERSION 2.6)
# CMake used to complain without this
#if(COMMAND cmake_policy)
# cmake_policy(SET CMP0003 NEW)
#endif(COMMAND cmake_policy)
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
2.简单操作
1)启动gdb
gdb hello
或者
gdb
file hello
2)显示程序
list 或者 l
3)打断点
break(b) main() //函数的入口处
break(b) 11 //行号
break(b) hello.c:14 //特定文件的行号
break(b) 12 if i=10 //if语句满足后在行号处打断点
4)获取断点信息
info break
5)删除断点
delete 13(断点编号)
6)运行程序
run(r)
7)单步(不进入子函数)
next(n)
8)单步(进入子函数)
step(s)
9)继续运行
continue(c)
10)查看变量
print(p) i(变量名)
11)运行程序到当前函数结束
finish
12)监控变量
watch i(变量名)
13)退出gdb
quit(q)
3.gdb命令总结
命令 | 描述 |
---|---|
backtrace(或bt) | 查看各级函数调用及参数 |
finish | 连续运行到当前函数返回为止,然后停下来等待命令 |
frame(或f) | 帧编号 选择栈帧 |
info(或i) | locals 查看当前栈帧局部变量的值 |
list(或l) | 列出源代码,接着上次的位置往下列,每次列10行 |
list 行号 | 列出从第几行开始的源代码 |
list 函数名 | 列出某个函数的源代码 |
next(或n) | 执行下一行语句 |
print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
quit(或q) | 退出gdb调试环境 |
set var | 修改变量的值 |
start | 开始执行程序,停在main函数第一行语句前面等待命令 |
step(或s) | 执行下一行语句,如果有函数调用则进入到函数中 |