启动GDB调试
在使用GDB之前,编译出带调试信息的程序,调试信息中包含了函数和变量所在文件和行号信息,通过gcc编译出debug版本 -g:
gcc -g test.c -o test
调试方式1 : 运行GDB程序并加载程序执行
(1) 可以用 gdb test
的方式,test为可执行程序名
[root ] # gdb test
(2) 也可以先启动 gdb , 然后用 file <文件名>
命令加载可执行文件
<root> gdb
(gdb) file test
调试方式2 : 对正在运行的程序进行调试
[root ]# ps -a
查看待调试程序的进程ID号
[root ]# gdb att pid
调试常用命令
-
1、
b
: 下断点 -
2、
X
: 查看内存
X/nfu Address
注:
n
:显示多少个单元
f
:o
(octal 8进制),x
(hex 16进制),d
(decimal 10进制)
u
:指定要打印的内容的长度;b
(Byte 1个字节),w
(word 4个字节)
例如:
X/8xb szArry
: 显示数组内容 -
3、
p
:查看
(1)p a
(2) 修改 :p a=12345
(3) 查看堆栈地址内容 :p *((int *)(0x7ffffffr4ac))
(4) 函数调用 :p Print_Hello
-
4、
thread
:线程
(1) 查看 :info threads
(2) 切换线程 :thread XXX
(3)thread num
显示线程情况,num为线程号 -
5、
r
:run的简写,运行被调试的程序 -
6、
bt
: backtrace的简写,查看堆栈(调用栈)的信息 -
7、
watch
watch <expr>
:为表达式(变量)expr
设置一个观察点;变量或表达式值有变化时,马上停住程序。- 表达式可以是一个变量
例如:watch value_a
- 表达式可以是一个地址:
例如:watch *(int *)0x12345678
可以检测4个字节的内存是否变化。 - 表达式可以是一个复杂的语句表达式:
例如:watch a*b + c/d
info watchpoints
: 列出当前设置的所有观察点 - 表达式可以是一个变量
core文件
gdb /xxx/xxx xxx.core
bt
通过上面的命令调试.core文件,可以看出是哪个函数中出错
1. gdb的调用堆栈详解: bt
调用堆栈是当前函数之前的所有调用函数的列表(包括当前函数),每个函数及其变量都被分配了个栈帧
,最近调用的函数(也就是当前函数)在0
号栈帧中(栈底帧),外层的调用函数的栈帧号依次+1
gdb通过命令bt
(backtrace
回溯)来打印堆栈
(gdb) bt
#0
#1
#2
2. 命令 frame args
:
参数args
表示编号num
或Address
,将当前栈帧设置为args
指定的栈帧,并打印该栈帧的简要信息
例如:
#切换到1号栈帧,并打印1号帧的内容
(gdb) frame 1
(gdb) info locals
3. 命令up/down
在当前栈帧向上回退/向下前进(更外层/更内层,即远离0号/靠近0号)n个栈帧,n默认为1
4. 打印栈帧信息
4.1 命令 frame
:
打印当前栈帧的简要信息
4.2 命令 info frame
:
打印当前栈帧的详细信息
4.3 命令 info frame args
:
打印指定栈帧的详细信息
4.4 命令 info args
:
打印当前栈帧函数参数信息
4.5 命令 info locals
:
打印当前帧中的局部变量的信息,缺省情况下当前帧就是被中断的函数,也就是0
号栈帧的函数
网友评论