目录
命令:gdb filename 对可执行文件进行调试(启动gdb软件)
gdb概述
1、gdb使用总旨:help指令很强大!多用help!help里面总会有你需要的信息。如果你不知道如何使用help,请在gdb里面输入:help all
2、调试按钮说明
第一个按钮——表示继续运行到下一个断点,没有下一个断点的话就直接运行结束
第二个按钮——next 单步调试,执行至一个分号结束的代码(若是一个函数则直接执行到这个函数结束,如果是单行代码,则执行完这行代码);可简写为n,表示下一步;
第三个按钮——step 单步调试,逐行执行代码,若遇到函数则步入当前函数,逐行执行。可简写为s
第四个按钮——退回至上一行代码;与第3个按钮刚好相反,一个向前一步执行,一个后退一步执行
第五个按钮——表示重新开始调试
最后一个按钮——暂停
3、在调试的时候可以将鼠标放在变量上查看变量的值
4、调试过程若无法查看map、set等容器内部的值或函数模板信息,考虑升级gdb版本
5、若想全称监视某个变量或容器的值,可以在"watch"即监视窗口添加变量名,
目标:
对sum.cpp文件进行调试;
添加-g参数命令生成可调试文件
- gdb仅支持对编译时添加了-g的参数命令生成的文件进行调试;
- 生成的带有调试信息的文件a_yes_g明显比不带调试信息的文件a_no_g更大;
命令:gdb filename 对可执行文件进行调试(启动gdb软件)
对不带调试信息的文件a_no_g启动gdb调试
显示不存在可调试信息:Reading symbols from a_no_g...(no debugging symbols found)...done.
输入quit退出gdb;
对带调试信息的文件a_yes_g启动gdb调试
显示存在可调试信息: Reading symbols from a_yes_g...done.
基本调试操作
启动 gdb——gdb filename;退出gdb——输入quit
一般是垂直分屏显示,左调试界面,右显示程序
执行程序:run
(gdb) run
Starting program: /home/hkm/c++/MyShare/sum/a_yes_g
sum = 5050
The program is over.
[Inferior 1 (process 4050) exited normally] //程序正常结束
在程序中加入断点:break 缩写为b
查看当前所有断点信息:info breakpoints 缩写为i b
(gdb) break
No default breakpoint address now.
(gdb) break 13 //程序第13行加断点
Breakpoint 1 at 0x555555554936: file sum.cpp, line 13. //内存地址0x555555554936;在文件sum.cpp的第13行;表示在程序13行成功打了一个断点
(gdb) info breakpoints //查看对当前可执行文件打了多少个断点
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000555555554936 in main(int, char**)
at sum.cpp:13
(gdb) b 14 //在14行打一个断点,键入b即可表示break
Breakpoint 2 at 0x55555555493c: file sum.cpp, line 14.
(gdb) i b //info breakpoints的缩写
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000555555554936 in main(int, char**)
at sum.cpp:13
2 breakpoint keep y 0x000055555555493c in main(int, char**)
at sum.cpp:14
完整调试演示:
(gdb) b 13 //13行打一个断点
Breakpoint 1 at 0x936: file sum.cpp, line 13.
(gdb) r //运行程序run
Starting program: /home/hkm/c++/MyShare/sum/a_yes_g //程序启动,给出程序绝对路径
Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at sum.cpp:13 //断点在sum.cpp中main函数13行
13 sum = sum + i;
(gdb) p i //查看变量i的值;等同于: print i
$1 = 1
(gdb) p N //查看变量N的值;
$2 = 100
(gdb) continue //表示继续调试,等同于windows下VScode调试中的F5
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at sum.cpp:13 //继续执行的过程,又加了一个断点在14行,原因是while循环
13 sum = sum + i;
(gdb) p i
$3 = 2 //此时i的值比上一次已经加1;上次print i显示i=1
(gdb) display i // 表示一直监测i的值
1: i = 2
(gdb) c //继续continue
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at sum.cpp:13
13 sum = sum + i;
1: i = 3 //因为display i,所以这里显示了i的值
(gdb) //按下回车enter,重复上次操作,即continue
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at sum.cpp:13
13 sum = sum + i;
1: i = 4
(gdb) list //查看断点处,上下5行的源代码,输入list即可,输入缩写l,效果一致
8 int i = 1;
9
10 // calculate sum from 1 to 100
11 while (i <= N)
12 {
13 sum = sum + i;
14 i = i + 1;
15 }
16
17 // print the result
(gdb) l 3 //list 3 设置显示断点处上下3行的源代码
1 #include <iostream>
2 using namespace std;
3
4 int main(int argc,char **argv)
5 {
6 int N = 100;
7 int sum = 0;
8 int i = 1;
9
10 // calculate sum from 1 to 100
(gdb) display sum //想查看此时sum的值
2: sum = 6
(gdb) c //continue
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at sum.cpp:13
13 sum = sum + i;
1: i = 5
2: sum = 10 //由于设置了 display sum,所以每次continue也增加显示sum的值
(gdb) //按下回车键,再次执行continue操作
Continuing.
Breakpoint 1, main (argc=1, argv=0x7fffffffdf98) at sum.cpp:13
13 sum = sum + i;
1: i = 6
2: sum = 15
上述操作对应的ubuntu操作界面显示如下: