gdb常用调试命令-2
gcc -g -o test test.c
gdb 或 gdb ./test
(gdb) file ./test
(gdb) r
Hello, World!
----------
调试代码:
run(r):运行代码
next(n):单步跟踪,函数调用当作一条简单语句执行
step(s):单步跟踪,函数进入被调用函数体内
finish : 退出进入的函数
until(u):退出一个循环体
continue(c):继续运行程序
查看运行时数据
print(p):打印变量、字符串、表达式等值
----------
共有三种设置断点的方法,分别是break(b), watch, catch throw type(如int)
设置断点(break)
b (break) 行号 # 设断点
b 函数名
b 文件名路径:行号 # 以上三种是设置断点的方法
b 行号-or-函数名 if i==9 #设置条件断点
b *(&bret) # 数据断点的打法,先取数据的地址,再往该地址上打断点,当该地址上的值改变时就会停下
i b :查看断点信息,具体信息如下:
断点编号(Num)、断点类型(Type)、是临时断点还是永久断点(Disp)、目前是启用状态还是禁用状态(Enb)、断点的位置(Address)、断点当前的状态(作用的行号、已经命中的次数等,用 What 列表示)
whatis #打印该变量的类型
- 使用watch打断点,为hardware watch point
watch bret # 当bret值变化时,断点
watch *(&bret) # 地址打法
watch condition # 条件变量打法,如 watch (bret != 1)
i watch # 查看watch设置的断点
- 删除
d (delete) 编号 #删除编号处(不是行号)的断点,如 d 1; d 1-10 # 删除第1到10个编号
clear 行号(或变量地址) # 有两种方法,分别时delete和clear,前者使用编号后者使用行号
- 禁用
disable [breakpoints] [num...]
disable # 禁止所有的断点
disable 1 2 # 表示禁用编号为1和2的断点
- 启用
enable [breakpoints] [num...]
enable num # 表示启用断点,dismiss禁用
enable once num # 表示可使用一次,之后仍然禁用
enable count num # 使用count次后,之后仍然禁用
enable delete num # 使用一次后,就删除该断点
bt:打印栈帧信息
找不到源代码,可使用list
若使用list命令无效,记住gdb的调试信息中并不包含源代码,
这个需要通过directory命令实现,由于某中原因,源代码移动
位置,则需要告诉gdb,gdb就会根据指定的路进查找,查看gdb
的查找路径:
show directories
dir dirname1:dirname2:dirname3
有时使用-g没有调试信息,可改成
-gstabs试一试,若还是不太理想,可使用
-gstabs+
list(l)行号:显示行号
l :从main函数开始
l 函数名