Linux调试器-gdb的使用

一.背景

• 程序的发布方式有两种:debug版本和release版本

=》debug:是程序的一个调试版本,增加了一些调试信息,这些调试信息,可以帮助程序员调试代码

=》release:是程序的发布版本,客户一般拿到的是这个版本,这个版本相对于debug版本编译器在编译的时候做了优化,程序运行更快

• Linux 操作系统下,默认在编译的时候生成的是release版本;如果想要生成debug版本,在编译的时候需要增加"-g"命令行参数
在这里插入图片描述
如上图所示release版本下aa文件和debug版本下bb文件运行结果是相同的,但bb文件大小比aa大,因为debug版本增加了调试信息

二.使用

1.调试可执行程序(debug版本)

• 进入调试界面 :gdb [可执行程序]

在这里插入图片描述

• 查看源代码:l(list)

若代码过长可能只会展示一部分,继续按l可继续展示
在这里插入图片描述

• 打断点:b [源码文件当中的行号]

在这里插入图片描述

• 查看断点信息:i b (info breakpoints)

在这里插入图片描述

• 去除断点:delete [断点的序号]

在这里插入图片描述

• 使断点失效:disable [断点的序号]

断点本质上还是在的,但是程序在执行的时候就不会停留在失效的断点处
在这里插入图片描述

• 使断点生效:enable [断点的序号]

在这里插入图片描述

• 使程序运行:r(run)

• 逐过程执行,对标win当中的F10,执行的命令是:n(next)

逐过程不会进入到被调用函数内部执行
在这里插入图片描述

• 逐语句执行,对标win当中的F11,执行的命令是:s(step)

逐语句会进入到被调用函数内部执行
在这里插入图片描述

• 继续执行:c(遇到下一个断点的时候就会停止执行)

• 打印变量的值:p [变量名称]

p [变量名称]:不仅仅局限于普通变量,还可以打印指针变量,还可以打印对象
在这里插入图片描述

• 退出:q (quit) 或 ctrl + d

• 注意:开始执行gdb命令的时候,可以直接回车执行上一次的命令

2.调试coredump文件

前提:本质上是在调试程序崩溃之后的内存镜像文件(core size)

以如下错误为例说明
在这里插入图片描述
产生coredump文件的条件:
(1)linux操作系统当中,需要设置core size的大小
ulimit -c查看core file size 的大小
ulimit -a查看所有的在这里插入图片描述

(2)磁盘大小

Segmentation fault(段错误):内存访问越界或者访问空指针导致的
在这里插入图片描述
内存镜像文件保存的是程序在崩溃的一瞬间内存当中的值
在这里插入图片描述

调试coredump文件:gdb [可执行程序][coredump文件]
在这里插入图片描述
tips:
11号信号:解引用空指针,解引用野指针,越界访问内存
6号信号:double free

猜你喜欢

转载自blog.csdn.net/weixin_50886514/article/details/114538036