程序员和网站开发,江西网站开发哪家专业,优购网官方网上商城,汕头seo公司#x1f3ac;慕斯主页#xff1a;修仙—别有洞天 ♈️今日夜电波#xff1a;HEART BEAT—YOASOBI 2:20━━━━━━️#x1f49f;──────── 5:35 #x1f504; ◀️ ⏸ ▶️ ☰ … 慕斯主页修仙—别有洞天 ♈️今日夜电波HEART BEAT—YOASOBI 2:20━━━━━━️──────── 5:35 ◀️ ⏸ ▶️ ☰ 关注点赞收藏您的每一次鼓励都是对我莫大的支持 目录 什么是gdb gdb的安装 如何读取可执行程序格式 gdb的调用
前提
唤醒gdb
gdb的使用 gdb的基本使用
listl 命令
break(b) 命令
info命令
开始调试
run/r
n/next s/step 和 c/continue
print(p)
display和undisplay
until
finish
breaktrace/bt
set var 什么是gdb GDB全称为GNU项目调试器GNU Project Debugger是一个功能强大的程序调试工具主要用于Linux环境下的软件开发。它允许开发者查看程序在执行时的内部活动或者在程序崩溃时正在执行的操作。 GDB主要用于调试C和C程序但也支持其他多种编程语言编写的程序包括C、C、Go、Objective-C、OpenCL等。其主要功能如下 启动程序可以自定义地运行程序。断点设置可以让被调试的程序在指定的断点处停住便于分析。单步执行可以逐行执行程序代码观察程序运行状态。打印变量可以在程序运行过程中查看或改变变量的值。观察变量可以动态查看程序中的变量值的变化情况。寄存器查看和堆栈查看可以查看当前程序运行的寄存器状态以及调用堆栈信息。 对于从事 Linux C/C 开发的程序员来说GDB是主要的调试工具尤其在没有IDE环境的嵌入式系统等资源限制的场景下GDB以其占用资源少、开源免费和方便实用而被广泛使用。 gdb的安装 yum install -y gdb//centos系统下下载,注意要在root模式下
apt-get install -y gdb//ubuntu系统下下载,注意要在root模式下 安装成功显示如下 如何读取可执行程序格式 我们在linux中形成可执行程序的格式为ELF格式
阅读可执行程序的格式 readelf -S 可执行程序名 -g//debug模式
readelf -S 可执行程序名 -r//release模式
readelf -S 可执行程序名 -g | grep -i 关键字//debug模式下查找关键字
readelf -S 可执行程序名 -r | grep -i 关键字//release模式下查找关键字 gdb的调用
前提 编译程序前需要加上 -g 选项 用以表示为debug模式 如果不加默认为release模式release模式下不能进行调试因为release模式下没有调试用的程序而debug模式下有调试用的程序。 如下为示例Makefile process:main.c process.cgcc -o $ $^ -g .PHONY:cleanclean:rm -rf process唤醒gdb gdb binFile //gdb 编译后的程序名 成功唤醒后进入如下状况 gdb的使用 gdb binFile 退出 ctrl d 或 quit 调试命令 listl 行号显示binFile源代码接着上次的位置往下列每次列10行。 listl 函数名列出某个函数的源代码。 r或run运行程序。 n 或 next单条执行。 s或step进入函数调用 break(b) 行号在某一行设置断点 break 函数名在某个函数开头设置断点 info break 查看断点信息。 finish执行到当前函数返回然后停下来等待命令 print(p)打印表达式的值通过表达式可以修改变量的值或者调用函数 p 变量打印变量值。 set var修改变量的值 continue(或c)从当前位置开始连续而非单步执行程序 run(或r)从开始连续而非单步执行程序 delete breakpoints删除所有断点 delete breakpoints n删除序号为n的断点 disable breakpoints禁用断点 enable breakpoints启用断点 info(或i) breakpoints参看当前设置了哪些断点 display 变量名跟踪查看一个变量每次停下来都显示它的值 undisplay取消对先前设置的那些变量的跟踪 until X行号跳至X行 breaktrace(或bt)查看各级函数调用及参数 infoi) locals查看当前栈帧局部变量的值 quit退出gdb gdb的基本使用
listl 命令 显示binFile源代码接着上次的位置往下列每次列10行当使用过一次list或者l后每次使用回车会继续显示接下来的10行代码。 当然也可以配合list/l 行号来查看对应行数的代码。通常而言l/list 行号 会显示包括它周围的10条代码简单的来说就是以要显示行数为中心然后显示前5行和后5行代码。如果 l/list 行号 前面的代码行数不够则会向后补齐到10条如果后面的行数不够则不会补齐只会显示他周围的代码。 也可以以listl 函数名 来显示某个函数的源代码。 break(b) 命令 break(b) 行号在某一行设置断点 break 函数名在某个函数开头设置断点 info命令 这里主要讲info断点的操作 info break 查看断点信息。info(或i) breakpoints参看当前设置了哪些断点。infoi) locals查看当前栈帧局部变量的值 关键字breakpoints delete breakpoints删除所有断点 delete breakpoints n删除序号为n的断点 disable breakpoints禁用断点 enable breakpoints启用断点 info(或i) breakpoints参看当前设置了哪些断点 当然disable breakpoints和enable breakpoints也是可以指定序号来进行禁用以及启用的只需要在后面添加相应的序号即可注意这个序号为断点Num下的序号。 开始调试
run/r 通常当我们打完断点后就要开始调试了对此我们要直接运行到断点处可以只用run/r 直接运行这个实际上就相当于我们VS中的F5如果没打断点则会直接运行完。 n/next s/step 和 c/continue 在运行到断点后我们通常会进行逐语句或者逐过程的调试n 或 next单条执行。s或step进入函数调用。这就对应着逐过程和逐语句。即VS中的F10和F11。continue(或c)则是直接跳到下个断点处如果接下来没断点则运行完后面的代码前提是已经运行到了某个断点。 print(p) print(p)打印表达式的值通过表达式可以修改变量的值或者调用函数。p 变量打印变量值。p 变量则为打印地址地址。 display和undisplay display 变量名跟踪查看一个变量每次停下来都显示它的值。undisplay取消对先前设置的那些变量的跟踪。使用display跟p是一样的都可取变量和地址然后每次运行n/s或者每次停下来都显示display后的值如果不想显示某个值我们可以通过undisplaydisplay后最前面的序号来取消显示。 until until X行号跳至X行。在跳至X行时会将中间的代码也顺便运行显示出来。 finish finish执行到当前函数返回然后停下来等待命令。如下我们进入到add函数再使用finish这可以用来检测函数是否有问题。 breaktrace/bt breaktrace(或bt)查看各级函数调用及参数。实际上就是查看调用堆栈。 set var set var修改变量的值。我们可以用set var 变量名要变成的值 用此来修改变量的值。 感谢你耐心的看到这里ღ( ´ᴗ )比心如有哪里有错误请踢一脚作者o(╥﹏╥)o 给个三连再走嘛~