gdb 调试命令

note:编译程序的时候需要增加-g选项,增加调试信息
1.启动GDB
gdb只是装载了程序,并没有运行,gdb默认启动后会显示gdb的版权信息,如果不想看版权信息可以增加-q选项。

2.退出GDB
q 或 quit

3.调试程序有两种方式:
(1)gdb -q test
(2)gdb -q
file test

4.退出调试
kill

5.查看调试文件源码:list
list:显示开始的10行代码
list 5,10 显示第5到第10行的代码
list func 显示行数func周围的代码,以函数func为中心
list xxx.c:5,10 显示xxx.c 文件的5-10行代码
list xxx.c:func 显示xxxx.c 文件func函数周围的代码,一函数func为中心

6.设置断点:breakpoint或者watch
b 行号或者函数名或者(xxx.c:func)。
eg:b 12 //12行打断点
eg:b get_sum //函数get_sum打断点
eg:b test.cpp:get_sum //test.cpp 中的get_sum 打断点

b 行号或者函数名或者(xxx.c:func)if 条件表达式
eg b 12 if i==20 //当i=20的时候触发断点

watch 条件表达式不需要函数名或者行号,根据当前运行环境来决定 (note:当条件表达式的值发生改变的时候出发断点,并不是条件表达式为真或者为假)
eg watch i==20 //当i==20条件表达式的值发生改变的时候出发断点

7.查看所有断点info breakpoint
eg info b //显示所有断点详细信息

8.删除断点clear或者delete
clear 行号或者函数名对应b打断点的方式
eg clear 12 //删除12行的断点
eg clear get_sum //删除get_sum 的断点

delete 断点的序号,如果不填写则删除所有断点
eg delete //删除所有断点
eg delete 1 //删除断点序号为1的断点(序号从断点列表可以得知)

9.禁用启动断点disable或者enable
disable 断点序号
eg disable 1//禁用断点序号为1的断点

enble 断点序号
eg enable 1//启动断点序号为1的断点

10.查看调试信息
a.查看变量信息:p(print) 变量 eg:p i
b.查看变量数据类型:whatis 变量 打印变量或者表达式数据类型 eg:whatis i
c.设置变量值: set variable 变量 = val eg: set variable i=10 设置i=10

11.单步调试
n:next 执行下一指令如果是函数不会进入函数,函数当做一条指令
s:step 执行下一指令如果是函数则进入函数
ni:nexti (汇编指令)执行下一机器指令*如果是函数不会进入函数
si:stepi (汇编指令)执行下一步指令如果是函数则进入函数
c:continue 继续运行直至下一断点

12.调试步骤
1.启动gdbgdb -q test
2.浏览源文件设置断点 list和b
3.开始调试run
4.单步调试
5.查看变量信息
6.跳转到下一断点c(continue)
7.结束调试kill或者重新调试run
8.退出gdbq(quit)

13.调试子进程(fork)
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
启动gdb:
gdb) set follow-fork-mode child

set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。

你可能感兴趣的:(Linux)