【linux】“gdb“调试方法与技巧

news2024/11/24 9:43:32

"gdb"调试方法与技巧

  • 一、什么是gdb?
  • 二、gdb的使用
    • 进入gdb调试
    • list/l 查看源码
      • l/list+行号
      • list/l+函数名
    • run/r运行
    • break(b)设置断点
    • info break查看断点信息
    • finish
    • n/next单条执行
    • s/step进入函数调用
    • p 变量
    • set var修改变量的值
    • continue/c
    • disable breakpionts
    • enable breakpoints
    • delete breakpoints
    • display
    • undisplay
    • until
    • breaktrace/bt
    • info (i)locals
    • quit/q
  • gbd总结
  • 🍀小结🍀

🎉博客主页:小智_x0___0x_
🎉欢迎关注:👍点赞🙌收藏✍️留言
🎉系列专栏:Linux入门到精通
🎉代码仓库:小智的代码仓库

一、什么是gdb?

gdb是一款开源的、功能强大的调试器,它可以用于调试多种编程语言,如C、C++、汇编语言等。gdb可以帮助开发者在程序运行时进行调试,并找到程序中的错误。gdb提供了许多常用的调试功能,如设置断点、单步执行、查看变量值等。

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

二、gdb的使用

我们使用c源文件进行演示。

进入gdb调试

在我们生成debug版本下的可执行程序之后可以使用gdb 可执行程序来进入gdb:
在这里插入图片描述
到这里我们就可以开始gdb调试了。

list/l 查看源码

l/list+行号

我们可以输入l/list+行号进行查看源码,默认显示前十行:
在这里插入图片描述
因为gdb可以记录我们上一条指令,所以我们再次按下回车会接着执行上一次的指令,可以查看剩余的代码:
在这里插入图片描述

list/l+函数名

l+list+函数名可以直接查看函数所在的区间代码:
在这里插入图片描述
他默认会将我们要查找的函数放在居中位置。

run/r运行

run/r开始运行程序直到遇到结束或者遇到断点等待下一个命令。
在这里插入图片描述

break(b)设置断点

break(b)+行号,可以在某一行加上断点。
在这里插入图片描述
break(b)+函数名,在某个函数开头设置断点。
在这里插入图片描述

info break查看断点信息

使用info break来查看当前设置的断点信息。
在这里插入图片描述

finish

finish执行到当前函数返回,然后停下来等待命令。
在这里插入图片描述

n/next单条执行

开始执行之后可以使用n/next进行单行执行,就是vs中的F10
在这里插入图片描述

s/step进入函数调用

开始执行之后可以使用s/step进行逐语句执行,就是vs中的F11.
在这里插入图片描述

p 变量

可以使用p +变量来打印变量的值。
在这里插入图片描述

set var修改变量的值

调试过程中可以通过set var来修改变量的值。
在这里插入图片描述

continue/c

continue/c:从当前位置来纳许而非但步骤执行程序。
在这里插入图片描述

disable breakpionts

disable breakpionts+断点号:可以禁用这个断点
在这里插入图片描述
可以看到禁用之后的断点 Enb属性从y变成了n.

enable breakpoints

enable breakpoints+ 断点号:可以启用这个断点。
在这里插入图片描述

delete breakpoints

delete breakpoints:删除所有断点
delete breakpoints+n:删除序号为n的断点。

display

display + 变量名:跟踪查看一个变量,每次停下来都显示它的值。
在这里插入图片描述

undisplay

undisplay + n取消对序号为n的变量的跟踪,如果不加n则会取消对所有先前设置的那些变量的跟踪。
在这里插入图片描述

until

until+n跳转至n行执行。
在这里插入图片描述

breaktrace/bt

breaktrace/bt:查看各级函数调用及参数。
在这里插入图片描述

info (i)locals

查看当前栈帧局部变量的值。
在这里插入图片描述

quit/q

quit/q:退出gdb。
在这里插入图片描述
这里由于我们并没有完成全部调试,所以他会询问我们是否要退出gdb,我们直接输入y即可退出gdb。

gbd总结

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • 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):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

🍀小结🍀

今天我们学习了"gdb"调试方法与技巧相信大家看完有一定的收获。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!
本篇的代码已上传gitee仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于javaweb旅游景点线路预定系统设计与实现

1.引言 随着我国人们生活水平的不断提高,旅游逐渐成为人们工作之余,进行放松压力,调节情绪的首要选择。近几年,我国旅游游客规模不断扩大,使旅游业得到快速发展,但也带来了更激烈竞争。面对更复杂的旅游业…

一分钟让你学会如何判断文件是否结束

文章目录 前言ferror函数feof函数ferror函数与feof函数搭配使用 前言 在所有的文件输入输出函数中,我们介绍了一系列的与文件的顺序读写有关的函数,它们调用成功与失败时的返回值各不相同,为了能更好地记忆这些函数,我们将这些函…

react使用SVGA特效 常用api

下载插件 npm install svgaplayerweb --save react中代码 import React, { useEffect } from react; import SVGA from svgaplayerweb const Svga () > {const bofang () > {var player new SVGA.Player(#demoCanvas);//创建实例var parser new SVGA.Parser(#demo…

【经验贴】项目管理过程中最容易忽略的问题,你踩了几个?

“有没有一句话送给刚入行的项目经理?” 随着毕业季的到来,最近发现越来越多类似的话题,评论区成了众多项目经理自嘲的“据点”,部分新手项目经理看完可能要重新考虑下职业规划了。 “要重点关注客户的需求,而不是项…

Android蓝牙协议栈fluoride(一) - 概述

发展 Android 4.2之前的版本采用Linux官方的蓝牙协议栈BlueZ,Android 4.2开始使用google和Broadcom共同开发的Bluedroid来替代BlueZ,但早期的Bluedroid并不完善,存在较多问题,更新迭代后将其更名为fluoride。接下来的系列文章将逐…

接口测试之深入理解HTTPS

前言 随着网络安全问题越来越被重视,HTTPS协议的使用已经逐渐主流化。目前的主流站点均已使用了HTTPS协议;比如:百度、淘宝、京东等一二线主站都已经迁移到HTTPS服务之上。而作为测试人员来讲,也要需时俱进对HTTPS协议要有一定的…

分布式调用与高并发处理 Dubbo分布式调用

一、Dubbo概念 1.1 什么是分布式系统 单机架构 一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器上,整个项目所有的服务都由这台服务器提供。 缺点: 服务性能存在瓶颈代码量庞大,系统臃…

未跟踪的文件: (使用 “git add <文件>...“ 以包含要提交的内容)怎么移除这些内容

有时候我们常常修改一些内容 手动就是:rm -rf system/core/healthd/images/.png 怎么丢弃呢? git clean -f . 删除这种文件

微信小程序设置底部导航栏

微信小程序设置底部导航栏 1、前言2、图标准备3、小程序tabbar设置 1、前言 我们先来看下效果图: 注意: 导航栏数量最多5个,最少两个。 2、图标准备 阿里图标库 http://www.iconfont.cn/collections/show/29 我们进入该网站,选…

第九章(1):循环神经网络与pytorch示例(RNN实现股价预测)

第九章(1):循环神经网络与pytorch示例(RNN实现股价预测) 作者:安静到无声 个人主页 作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发…

1.4 MVP矩阵

MVP矩阵代表什么 MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。 我们的顶点坐标起始于局部空间(Local Space),在这里他成为局部坐标(L…

【PHP面试题35】什么是MVC,为什么要使用它

文章目录 一、前言二、MVC介绍2.1 模型(Model)2.2 视图(View)2.3 控制器(Controller) 三、MVC模式的优点四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域…

『分割』 平面模型分割

PCL提供的几个常见模型: pcl::SACMODEL_PLANE:平面模型,用于拟合平面结构的点云数据。 pcl::SACMODEL_SPHERE:球体模型,适用于拟合球体结构的点云数据。 pcl::SACMODEL_CYLINDER:圆柱体模型,用…

一个四年Android程序猿的2023上半年总结

一晃就做了四年的Android开发了,时光飞逝啊~ 工作的时间飞快,感觉每一天都很充实,但是大多数都是重复的样子。 去年的目标达成: 去年的目标就是学习学习,涨薪涨薪。上家公司的同事氛围很不错&#xff0…

一篇文章了解Redis分布式锁

Redis分布式锁 什么是分布式锁? ​ redis分布式锁是一种基于redis实现的锁机制,它用于在多并发分布式环境下控制并发访问共享资源。在多个应用程序或是进程访问共享资源时,分布式锁可以确保只有一个进程可以访问该资源,不会发生…

采用555时基电路的简易/可调定时长延时电路设计

采用 555 时基电路的简易长延时电路 本电路和一般的定时电路相比是通过在 555 时基电路的 5 脚处加了一个二极管 VD1,使得定时时间延长的特点。 一、电路工作原理 电路原理如图 11 所示。 当按下按钮SB时,12V的电源通过电阻器Rt向电容器Ct充电&#…

弹性IP和公网IP有什么区别?哪个好

​  弹性IP和公网IP有什么区别?哪个好。IP是服务器重要的组成资源,一台云服务器实例一般分为公网IP和内网IP,公网IP指的是对外访问的IP地址,是针对公众用户的IP,这是网站绑定的服务器IP地址。而内网IP顾名思义就是内部的网络IP…

Android Monkey稳定性测试

l 命令样例: adb shell monkey -p packagename --ignore-timeouts --ignore-crashes -v -v --throttle 200 1000000 各个参数的意义如下: -p 用此参数指定一个或多个包(Package)。指定包之后,Monkey将只允许系统启…

cmake多文件、多文件夹编译(2)

一、同级文件夹下代码调用问题 目录如下: ./testCMake(根目录): /build: /MyClass: CMakeLists.txt MyClass.cpp MyClass.h /MyFunction: CMakeLists.txt MyFunction.cpp MyFunction.h CMakeLists.txt main.cpp 上述…

day35-Postman/ajax

0目录 1.postman 2.ajax 1.Postman 1.1 定义:postman用于测试http协议接口,无论是开发还是测试人员 1.2 Servlet中的doGet()/daPost…