第一个gdb命令行调式案例(详细举例)

31 篇文章 2 订阅

目录

gdb概述

目标:

添加-g参数命令生成可调试文件

 命令:gdb filename 对可执行文件进行调试(启动gdb软件)

对不带调试信息的文件a_no_g启动gdb调试

对带调试信息的文件a_yes_g启动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操作界面显示如下:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值