gdb 调试使用
1.gdb programe
不带参数,调试可执行文件programe;
gdb programe core
带一个执行文件+一个核心文件
gdb programe 1234
带一个可执行文件+PID (除非你的核心文件名是‘1234’,因为GDB先检测核心文件)
2.gdb 命令
2.1 b|break [file:] function
在某个文件里的函数加上断点
2.2 r|run [arglist参数列表]
运行
2.3 bt|backtrace 打印程序的栈
为堆栈提供向后追踪功能
2.4 print expr 打印表达式的值
print p 值
print function
whatis p 类型
2.5 c 继续执行 continue在stop结束之后或者断点之后
2.6 n 单步执行或者在结束之后继续执行下一行
2.7 edit [file:]function 查看程序行数在哪里结束的!
2.8 list [file:] function 打印停止处的程序代码 vicinity 附近的
2.9 s|step 执行停止后的下一个程序行;单步执行下一行
2.10 help [gdb command name] 命令帮助
2.11 q|quit
3.断点处理
3.1
info b 查看断点列表
Num Type Disp Enb Address What
3 breakpoint keep y 0x00000000004005bc in test2 at gdb_test.c:6
breakpoint already hit 1 time
6 breakpoint keep y 0x0000000000400612 in test at gdb_test.c:12
7 breakpoint keep y 0x0000000000400629 in test at gdb_test.c:13
Num 断点号 type 断点 disp ? Enb 允许y/禁止n Address 地址 What 范围行号等信息
3.2 创建断点
b pos (pos可以是函数,可以是行号,确定范围)
3.3 删除断点
delete breakpoint num (删除断点num,如果不加num全部删除)
clear line (删除line行的所有断点)
3.4 禁止/允许断点
enable/disable breakpoint num
4.信号
gdb通常可以捕捉信号,通过捕捉信号,它可决定正在运行的进程要做些什么工作
handle命令可控制信号的处理,它有两个参数,先是信号名(可以是名字或者是信号编号kill -l 查看) 之后是接受到信号需要做些什么
参数 有
nostop/stop停止执行与否
noprint/print打印信息
nopass/pass 将信号传递给进程与否,传递的话允许进程对其进行处理
eg:
handle SIGINT stop noprint
5.搜索文件
search test 搜索含有‘test’的行 向后搜索
reverse-search test 搜索。。。 向前搜索
输出该行行号以及内容
6.shell 回到shell ,CTRL+D 回去gdb
7.命令的历史
set history expansion on 允许使用历史命令
相反的 off
8.kill 结束正在被调试的程序
9.查看info
info prog 查看执行文件运行状态
info var 查看变量
info files 显示被调试文件的详细信息
info local 显示当前函数中的局部变量信息
info func 显示所有函数信息
list 显示代码段
10.单步运行
next 在不单步执行其他函数的情况下,向前执行一行源代码
step 进入的单步执行
进入某个函数想要退出,可以使用kill/finish命令
11.其他命令
pwd 当前工作目录
cd
display 程序停止时显示变量和表达式
undisplay 相反
down下移栈帧,使得另一函数成为当前函数
up 上移栈帧 ,使另一函数成为当前函数
frame 选择下一条continue命令的帧
jump 在源程序另一点开始执行
pype显示一个数据结构的内容 如一个结构或者c++类
set variable 设置变量赋值!!
signal 发送信号到当前运行的进程
watch 在程序中设置一个监测点
whatis 显示变量或类型
12.gdb 直接运行
help 出现命令分类
13.print 命令的使用
14.set 命令
set variable 变量=值
15.watch 命令
以条件表达式设置断点
b 7 if i==10
还有一种以表达式设置断点的方法
watch i==99 在i变量被定义的后一行设置中断,程序暂停后可以使用命令设置断点了
实例
查看错误的行号 where
list查看错误处附近的代码