linux_GDB调试学习(调试运行、多文件设置断点)_C/C++程序调试

接上一篇:linux静态库、linux动态库制作、使用,动态库报错:error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory

本次来分享linux下C/C++程序调试,也就是GDB工具的使用,不废话,上一盘GDB菜:


  使用gdb进行调试肯定需要 gcc/g++编译器,这里推荐一下博主的文章,欢迎各位网友阅读:

gcc/g++编译器学习

1.GDB简介

   GDB(GNU Debugger)是gcc的调试工具,其功能强大。
GDB主要帮忙你完成下面四个方面的功能:

①启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
②可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
③当程序被停住时,可以检查此时你的程序中所发生的事。
④动态的改变你程序的执行环境。

linux下C/C++程序调试,需要使用GDB工具,若是没有安装该工具,则输入命令:sudo apt-get install gdb

终端输入命令:gdb -v #查看gdb版本

2.生成调试信息(重点)

  一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
  gcc -g hello.c -o hello
  g++ -g hello.cpp -o hello
  如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。 当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试程序吧。

3.启动GDB 的方法

命令:

gdb program		#program也就是你的执行文件,一般在当前目录下。

4.GDB调试运行

4.1.程序运行参数命令

set args 		#可指定运行时参数。(如:set args 10 20 30 40 50 )
show args 		#命令可以查看设置好的运行参数。
run  			#运行程序,跑到断点出停止,可简写成r
start			#运行程序,开始只执行一步

4.2.工作目录命令

cd 		#相当于shell的cd命令。
pwd 	#显示当前的所在目录。

5.显示源代码命令(list)

  GDB会报告程序停在了哪个文件的第几行上。
  可以用list命令来打印程序的源代码,list默认打印10行
list可以简写成(l)

l		#默认打印main函数所在的文件前10行,输入一次l以后,当你想继续查看剩下的代码,直接按回车就可以了
l linenum				#在当前源文件中以行号linenum为中心打印行。
l function				#显示函数名为function的函数的源程序。
l testfile.c:20			#从testfile.c文件的第20行开始显示
l testfile.c:testfunc	#显示testfile.c文件的testfunc函数代码
l -			#显示当前行前面的源程序。

  一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

set listsize count	#设置一次显示源代码的行数(listsize)。(除非列表参数显式指定其他数字)
show listsize    	#查看当前listsize的设置。

6.设置断点

6.1.简单断点

 break 		#设置断点,可以简写为b
 b 10 		#设置断点,在源程序第10行
 b func 	#设置断点,在func函数入口处

6.2.多文件设置断点

在进入指定函数时停住:
  C++中可以使用class::function或function(type,type) 格式来指定函数名。如果有名称空间,可以使用namespace::class::function或者function(type,type) 格式来指定函数名。
例如:

 break filename:linenum 	#在源文件filename的linenum行处停住
 break filename:function 	#在源文件filename的function函数的入口处停住
 break class::function或function(type,type) 	#在类class的function函数的入口处停住
 break namespace::class::function 		#在名称空间为namespace的类class的function函数的入口处停住

6.3.查看所有断点信息

 info b	#或者简写成i b

6.4.设置条件断点

一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件。
例如,设置一个条件断点:

b test.c:8 if intValue==5	#在test.c第8行设置一个断点,只有在intValue=5时生效
b 15 if i==5	#在当前文件第15行设置断点,只有i等于5时生效

注意:在使用run命令的时候,设置的条件断点只能在循环内部,否则程序不会停止

6.5.删除断点、维护断点

delete [range…]   #删除指定的断点,如果不指定断点号,则表示删除所有的断点。
range 表示断点号的范围(如:3-7)。其简写命令为d。
例如:

d			#删除所有断点
d 1			#删除1断点号对应的断点,格式:d +断点好号
d 2-4		#删除第2-4的断点

比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。

disable [range…]   #disable所指定的停止点,如果什么都不指定,表示disable所有的停止点。简写命令是dis.
enable [range…]   #enable所指定的停止点,如果什么都不指定,表示enable所有的停止点。简写命令是ena.

disable和enable 用法和delete一样。

7.调试代码命令

run 			#运行程序,可简写为r
next 			#(可简写为n)单步跟踪,函数调用当作一条简单语句执行
step 			#(可简写为s)单步跟踪,函数调进入被调用函数体内
finish 			#退出进入的函数,若是你的函数里有断点,是不能退出的
until 			#(可简写为u)在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,即跳出当前(for)循环
continue 		#(可简写为c)继续运行程序
p j				#(print)查看j变量的值
ptype arr		#查看arr变量的类型
display j		#在循环中,每循环一次,就会把变量j的值打印出来,前提是j存在
i display		#查看你追踪变量的编号
undisplay 1		#取消编号为1的变量打印
set var i=10	#在运行时,设置变量i=10,就是设置变量的值
quit			#退出gdb调试

以上就是本次的分享了,希望能对广大网友有帮助。

此博主在CSDN发布的文章目录:【我的CSDN目录,作为博主在CSDN上发布的文章类型导读

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

futureCode.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值