1. 背景
- 程序的发布方式有两种,debug模式和release模式
- debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
- Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
- Linux gcc/g++编译出来的二进制程序,默认是release模式
- 因此要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
2. gdb调试界面命令汇总
进入:gdb binFile
退出:ctrl + d
或 quit
/q
调试命令:
l(list) 行号
:显示binFile源代码,接着上次的位置往下列,每次列10行。l(list) 函数名
:列出某个函数的源代码。r(run)
:运行程序。n(next)
:逐过程执行(不会进入函数内部)。s(step)
:逐语句执行b(break) 行号
:在某一行设置断点b(break) 函数名
:在某个函数开头设置断点i b(info break)
:查看断点信息。disable 断点号
:禁用断点enable 断点号
:启用断点p(print)
:打印表达式的值,通过表达式可以修改变量的值或者调用函数p 变量
:打印变量的值。bt/where
:当前函数的调用堆栈,显示的结果由下至上为函数的调用顺序f(floor) 函数序号
:显示某一正在调用的函数的临时变量的信息。finish
:执行到当前函数返回,然后停下来等待命令set var
:修改变量的值c(continue)
:从当前位置开始连续而非单步执行程序delete breakpoints
:删除所有断点delete breakpoints n
:删除序号为n的断点i(info) breakpoints
:参看当前设置了哪些断点display
变量名:跟踪查看一个变量,每次停下来都显示它的值undisplay
:取消对先前设置的那些变量的跟踪until X(行号)
:跳至X行breaktrace(或bt)
:查看各级函数调用及参数info(i) locals
:查看当前栈帧局部变量的值q(quit)
:退出gdb
3. Release版本调试
- 发布的时候,同时发布有-g参数和没有-g参数的
- 有两种调试方式:
①带有-g参数的生成调试符号表,给调试发行版本作为符号源使用;
objcopy --only-keep-debug [带-g选项的可执行文件] [输出的符号文件]
:生成调试符号表
gdb --symbol [输出的符号文件] -exec [release发布的可执行文件]
:使用生成的调试符号表
②直接使用调试版本作为符号源使用(常用)
gdb --symbol [带-g发布的目标执行文件] -exec [release发布的可执行文件]
注意:在发布调试版本和release版本时,编译选项(优化级别、链接库等)应尽可能保持一致。
4. Core文件调试
Core文件保存的是一个内存映象,同时包含调试信息,主要是用来调试的。
gcore [core文件名]
(gdb模式下):生成core文件
gdb [可执行文件] [core文件]
:调试core文件