【直接启动】 gdb prog
【启动加参】 gdb –args ./prog param
【启动加参】 ① gdb prog ② (gdb) run param
gdb a.out
(gdb) run 11 12 beijing
r [run] 运行程序
c [continue] 断点后,继续运行
s [step] 执行一行代码,若为函数,则跳到函数内部
n [next] 执行一行代码,若为函数,则直接运行整个函数体
u [until] 结束循环
f [finish] 结束函数
where 任何时候查看代码执行在哪里
l [list] 用于查看调试程序源代码。Note: 编译时,加参数-g。
p [print] 用于查看变量
格式打印
p /FMT variable
FMT:
o octal x hex d decimal u unsigned decimal t binary f float
a address c char s string
int arr1[] = {1, 2, 3, 4};
int *arr2 = new int[1];
*arr2 = 5;
int val = 16
(gdb) p arr1
$4 = {1, 2, 3, 4}
(gdb) p arr2[0]@1
$5 = {5}
(gdb) p /o val
$6 = 020
pt [ptype] 查看变量类型,对于结构体,可以查看结构体内变量
struct Student
{
int age;
string name;
};
(gdb) pt st
type = struct Student {
int age;
std::string name;
}
(gdb) p st
$1 = {age = 20, name = "xiaoming"}
x /FMT address
FMT 同1.2
(gdb) p /a &val
$1 = 0x7fffffffe36c
(gdb) x /d 0x7fffffffe36c
0x7fffffffe36c: 16
x /nfu address
n 显示组数
f FMT
u 几个字节组成一组 [b 单字节 h 双字节 w 四字节]
int val = 0x01020304
(gdb) p /a &val
$1 = 0x7fffffffe37c
(gdb) x /4db 0x7fffffffe37c
0x7fffffffe37c: 4 3 2 1
可见,该机器为小端,即低位字节放在低地址。如 04 放在 0x7fffffffe37c 。
b [break] 针对行号与函数设置断点
watch 针对变量有写操作时停住
rwatch 针对变量有读操作时停住
awatch 针对变量有读写操作时停住
[note] 观察点可以认为是针对变量设置断点。
15 int main(int argc, char *argv[])
16 {
17 int val = 1;
18
19 xxxxx
20
21 val = 4;
22 }
(gdb) break 17
(gdb) r
(gdb) watch val
(gdb) c
Continuing.
Hardware watchpoint 2: val
Old value = 0
New value = 4
main (argc=1, argv=0x7fffffffe468) at test.cpp:22
观察点检测变量,只能到变量的作用域中,才能添加观察点,非常不方便。这里,可以使用命令,自动添加观察点。
(gdb) break 17
Breakpoint 1 at 0x400569: file test.cpp, line 17.
(gdb) commands 1
> watch val
> c
> end
(gdb) r
Breakpoint 1, main (argc=1, argv=0x7fffffffe468) at test.cpp:17
17 int val = 1;
Hardware watchpoint 2: val
Hardware watchpoint 2: val
Old value = 0
New value = 4
首先添加断点[ Breakpoint 1],然后添加命令,在断点1处执行。
info break 查看停止点
info break [n] 查看停止点N
info watchpoints 仅查看观察点
delete 清除全部
delete n 清除某个
delete m-n 清除范围
clear 清除范围内停止点
disable n 禁用某个停止点
enable n 启动某个停止点
disable m-n 禁用范围内停止点
enable m-n 启用范围内停止点
ignore n count
ignore 2 5 忽略5次断点2,即第6次时,停住。在循环时特别好用。
break xxx if condition
int result = 0;
for (size_t i = 0; i < 100; i++)
{
result += i;
}
(gdb) break 20 if result = 10
bt [backtrace]
调试core的时候,一般是上来第一个命令,看程序挂在哪里。
frame n [切换栈帧]
info frame 显示当前栈信息
info locals 显示当前栈局部变量
info args 显示函数实参
gdb a.out -c core.5117_a.out
(gdb) bt
#0 0x00007fcbd24124f3 in XXXX
#1 0x400ca5 in GetLinkInfo (link_id="19431", link_info=0x7ffff9dd9280) at main.cpp:25
#2 0x400dae in RemoveBadLink () at main.cpp:46
#3 0x400e4c in main () at main.cpp:60
(gdb) frame 1
#1 0x400ca5 in GetLinkInfo (link_id="19431", link_info=0x7ffff9dd9280) at main.cpp:25
25 *link_info = iter->second;
(gdb) info args
link_id = "19431"
link_info = 0x7ffff9dd9280
attach 上某个进程后,进程立即停止运行。在退出gdb,detach该进程后,进程才继续运行。
[方法一] gdb prog pid
[方法二] gdb prog -> (gdb) attach pid
set var = 3 [仅修改]
print var = 3 [修改并打印]
10 int result = 0;
11 for (int i = 1; i < 100; i++)
12 {
13 result += i;
14 }
(gdb) set result = 200
(gdb) p result = 300
$1 = 300
display var
(gdb) break 10
(gdb) r
(gdb) display result
1: result = 0
(gdb) n
1: result = 0
(gdb) n
1: result = 0
(gdb) n
1: result = 1
每执行一步,都会显示该变量,无论变量值是否发生变化。