🥁作者: 华丞臧.
📕专栏:【LINUX】
各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注
)。如果有错误的地方,欢迎在评论区指出。
推荐一款刷题网站 👉 LeetCode刷题网站
文章目录
- 前言
- gdb调试器
- readelf指令(了解)
- gdb操作
- 查看代码
- 退出gdb
- 断点
- 运行程序
- 查看调用堆栈
- 执行整个函数
- 查看变量的值
- 其它
前言
- 在vs当中,我们知道可执行程序的发布方式有两种:debug和release模式;
- Linux gcc/g++出来的二进制程序,默认是release模式;
- 要使用gdb调试,必须要在源代码生成可执行程序的时候,加上-g选项。
gdb调试器
在Linux中,虽然和windows的调试器思路上是一样,但是其各自的操作方式却大不相同,gdb就是Linux上的调试器。
//安装gdb
sudo yum install -y gdb
//调试程序
gdb [文件名]
当我们安装好gdb准备调试程序时,gdb会告诉我们无法调试,这是因为默认情况下Linux中用gcc/g++生成程序是release模式,是无法直接被调试的。
为什么有debug和release两种版本?
首先我们要了解什么是debug和release:
debug
:通常称为 调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。release
:通常称为 发布版本,是给用户使用的,一般客户不需要在发布版本上进行调试;所以不保存调试信息,同时,进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利。- 程序员经常需要进行代码编写以及调试程序,那么就需要以debug版本发布以保证程序是可以被调试的;用户不需要关心软件是否可以debug用户也不需要,用户的需求就是软件怎么用以及好不好用。
debug版本发布选项如下:
-g
:生成以debug模式生成二进制程序。
加上-g选项后,我们就能使用gdb开始调试了,并且我们可以发现release版程序
要比debug版程序
的体积小:
readelf指令(了解)
功能:读取程序内部相关符号表。
其命令格式如下:
readelf -S [文件名]
//筛选出debug
readelf -S [文件名] | grep debug
可以看到debug版的程序中添加了很多调试信息,而release版的程序当中并没有添加。
gdb操作
调试代码如下:
//test.c文件中的代码如下:
#include <stdio.h>
#include <time.h>
void Print(int val)
{
long long timetmp = time(NULL);
printf("val = %d, timetmp: %lld\n", val, timetmp);
}
int GetSum(int begin, int end)
{
int ret = 0;
for (int i = begin; i <= end; ++i)
{
ret += i;
}
return ret;
}
int main()
{
int val = GetSum(0, 100);
Print(val);
return 0;
}
查看代码
查看代码:list 简称 l
从第n行开始显示:l + n
l 从上一次的结尾处开始显示,
gdb默认会记住历史上曾经的指令
代码在gdb调试器中的行数如下图:
退出gdb
退出调试:quit 简称 q
断点
打断点:break 简称 b 格式:b + n(行号)
查看断点:info break || info b
删除断点:delete 简称 d 格式:d + n(编号)
禁用断点:disable n(断点编号)
启用断点:enable n(断点编号)
断点被禁用时,程序直接运行到结束:
运行程序
运行程序:run 简称 r
逐过程调试:next 简称 n
逐过程就是不进入当前行的函数内部,直接把函数跑完。(vs上的F10)
逐语句:step 简称 s
逐语句就是进入当前行的函数内部,逐语句执行。
(vs上的F11)
逐断点:continue 简称 c
跳转到指定行:until + n(行号)
注意:使用until跳转时中间不能有断点,否则会停在断点处,并且跳转到空行处会被执行到下一行。
查看调用堆栈
查看堆栈:bt
执行整个函数
finish:执行到当前函数返回,然后停下来等待命令
查看变量的值
查看变量的值:p + 变量名
常显示变量的值:display
取消常显示:undisplay + n (n表示编号)
其它
- set var:修改变量的值;(格式:set var [变量名]=N)
- info locals:查看当前栈帧局部变量的值。