Linux:gdb调试

gdb

gdb(GNU debugger )是GNU开源组织发布的一个强大的Linux下的程序调试工具,它可以:

  1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
  2. 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
  3. 当程序被停住时,可以检查此时你的程序中所发生的事
  4. 可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG

Debug与Release

gdb调试的是可执行文件的Debug版本,这里简单提一下Debug版本与Release版本

生成的可执行文件可以有Debug版本和Release版本,gcc默认生成的是Release版本

Debug版本:可调试的版本,它包含调试信息,并且不作任何优化,便于开发人员调试程序

Release版本:发行版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用,它不可单步执行之类的

gcc默认生成的是Release版本,在编译时加上-g选项可以生成Debug版本

gcc -g  源文件.c  -o  指定的文件名

-g选项与-o选项缺一不可,如果是分步完成编译链接,-g选项必须加到编译阶段

在这里插入图片描述

gdb的使用

1、使用gdb打开文件

gdb  debug版本的可执行文件  #gdb后面跟的必须是debug版本的可执行文件,否则会报错

在这里插入图片描述

2、查看源码

list                #list可以简写为l,用list默认查看main函数所在的代码
list 源代码文件      #查看指定文件的代码
list 源代码文件:行数 #查看指定文件指定行数周围10行的代码
list 文件名:函数名   #查看指定文件指定函数周围10行的代码
#命令一次只能显示十行,若想查看后面的源码可一直按回车键,直到所有源码显示完

在这里插入图片描述

断点管理

1、添加断点

b 行号  #将断点添加到最近一次显示的文件的指定行
b filename:行号  #将断点添加到filename的指定行
b functionname  #将断点添加到指定函数的第一行
#b全称breakpoint

2、查看已有的断点的信息

info break  #break可以简写为b

在这里插入图片描述

3、删除断点

d 断点号  #删除指定的断点

4、添加条件断点

这种断点是当满足一定条件时才会触发,比较适合进行异常排查

break line-or-function if (condition)
b src/main.cpp:127 if cnt==10

5、将断点设置为无效

将断点设置为无效并不会删除该断点,当需要时可以继续启用

disable [breakpoints] [range...]  #disable可以简写为dis

breakpoints为断点号。 如果什么都不指定, 表示disable所有的停止点。 简写命令是dis

6、恢复断点

与disable对应的就是启用设置为无效的断点,即恢复断点

enable [breakpoints] [range...]
enable once [breakpoints]  #仅仅恢复断点一次,当程序停止后, 该断点马上被GDB自动删除

执行流程控制

1、启动调试,开始执行

run  #可以简写为r

2、单步执行

next  #逐过程,简写为n    调用函数的语句中:n直接执行完函数继续执行
step  #逐语句,简写为s    s进入函数一句一句执行
finish  #直接将当前函数执行完成,退出到调用函数的下一条指令的位置

3、继续执行,直到下一个断点

c

4、退出循环体

until   #简写为u

5、退出调试

q

程序变量

查看变量的值

p valname
p &valname
p 数组名  #显示数组中所有元素的值
p 数组指针  #显示的是指针的值

执行一次p显示一次,如果不执行p,则不会显示

查看变量的类型

ptype valname

自动显示变量的值

display valname  #每执行一次next或step,就显示一次

根据内存地址查看内存的存储值

x <addr>  #<addr>表示一个内存地址

显示函数调用堆栈

bt  #打印当前的函数调用栈的所有信息

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/huifaguangdemao/article/details/108428969
今日推荐