🏖️作者:@malloc不出对象
⛺专栏:Linux的学习之路
👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈
前言
本篇文章我们将要学习的是Linux下的调试器gdb,作为一名优秀的程序员必然要学会调试,接下来我们就来学习吧!!
一、什么是gdb
GDB的全称是GNU Debugger,它是GNU工具集的一部分。GDB可以在命令行界面或图形用户界面下使用,具有强大的功能和灵活的命令行选项。通过GDB,程序员可以设置断点、单步执行程序、打印变量值、查看堆栈信息等等。除了基本的调试功能,GDB还提供了一些高级功能,例如支持远程调试、支持多线程调试、支持动态加载模块调试等等。GDB还可以通过脚本语言进行扩展,从而自定义各种功能。
总之,GDB是一个功能强大的调试器,它可以帮助程序员快速定位和修复程序中的错误,提高程序的质量和可靠性。
二、使用gdb
在使用gdb之前,首先我们先写好我们的源文件以及Makefile文件
接下来我们使用gdb准备对我们形成的可执行程序mytest进行调试:
但是使用gdb时我们出现了一些问题,为什么会它提示我们找不到调试信息??
这是因为在 Linux 中,用 gcc/g++ 生成的可执行程序默认是 release 版本的,而 release 版本是没有调试信息的,只有 debug 版本才会有调试信息。那么,要想gcc/g++编译生成debug 版本的可执行程序,而我们只需加上-g选项就能加入我们的调试信息了!!
下面我们继续来检测一番:
Linux下我们的文本格式是ELF,所以我们可以readelf这个工具来查看可执行程序包含的信息:
我们可以看到debug版本中确实加入了很多调试信息,而我们使用工具渎取release版本的信息竟然没有任何显示,这其实也在我们的意料之中。
三、gdb的操作
下面我们来学习gdb的基本操作,要想了解gdb的操作首先我们要对VS中的各项调试操作很熟悉,如果VS中的各项调试操作你已经很熟悉的话那么对于gdb的使用成本就会小很多!!因为我们的调试功能其实都大致差不多。
指令 | 功能说明 |
---|---|
l/list 行号 | 显示binFile源代码,接着上次的位置往下列,每次列10行 |
l/list 函数名 | 列出某个函数的源代码 |
r/run | 运行程序(没有设置断点的情况下) |
n/next | 单条执行(VS逐过程 F10) |
s/step | 进入函数体内(VS逐语句 F11) |
b/break 行号 | 在某一行设置断点(每设置一个断点就有一个对应的编号,即使删除了此时的断点,但这个断点的编号还是不会被取代),例如:假设我设置了17 18行的断点,此时我对应的断点编号为1 2,我此时删掉断点1,再设置17行的断点,此时的断点编号为2和3并不会取代编号1 |
b/break 函数名 | 在某个函数开头设置断点 |
info b/break | 查看断点信息 |
finish | 执行完当前函数的代码回到调用该函数处,然后停下来等待命令 |
p/print | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
p 变量 | 打印变量值(临时显示) |
display 变量名 | 跟踪查看一个变量,每次停下来都显示它的值(常显示) |
undisplay | 取消对先前设置的那些变量的跟踪 |
set var | 修改变量的值 |
r/run | 执行程序到第一个断点处 |
c/continue | 从当前断点位置执行代码到下个位置的断点 |
delete breakpoints | 删除所有断点 |
delete breakpoints n | 删除序号为n的断点(该序号不为在某处设断点的行号,而是断点的编号) |
disable breakpoints | 禁用断点(r开始调试时会忽略该断点) |
enable breakpoints | 启用断点 |
info/i breakpoints | 参看当前设置了哪些断点 |
until X行号 | 跳至X行,执行完中间的代码 |
bt/breaktrace | 查看各级函数调用及参数 |
info/i locals | 查看当前栈帧局部变量的值 |
quit | 退出gdb |
以上就是gdb的所有操作了,其实本质上跟在Windows下VS中调试是差不多的,只不过VS中是图形化界面更方便我们去观察,我们对比VS中的调试功能去理解gdb是很容易上手的,这块大家多练习练习就没什么问题了。
注:按下回车键默认会执行上一次的命令,所以在需要执行多次一样的指令时我们可以使用回车快速执行!!
本篇文章gdb的讲解就到这里了,如果有任何问题或者疑问欢迎大家评论区随时交流哦orz~🙈🙈