【Linux操作系统】深入了解系统编程gdb调试工具
在软件开发过程中,调试是一个非常重要的步骤。无论是在开发新的软件还是维护现有的代码,调试都是解决问题的关键。对于Linux开发者来说,GDB是一个非常有用的调试工具。在本文中,我们将探讨Linux中使用GDB进行调试的方法和技巧。
文章目录
- 一、安装gdb
- 二、编译可调试的程序
- 三、启动gdb调试
- 四、设置断点
- 五、观察变量的值
- 六、单步执行程序
- 七、观察堆栈
- 八、修改变量的值
- 九、继续执行程序
- 十、条件断点
- 十一、查看源代码
- 十二、查看内存内容
- 十三、调试崩溃程序
- 十四、远程调试
- 十五、调试多线程程序
- 十六、调试动态链接库
- 十七、退出调试
- 总结:
GDB是GNU调试器的缩写,是一个功能强大的调试工具,可用于调试各种编程语言的程序。它可以帮助开发者找出程序中的错误,并提供了一些高级功能,如断点设置、变量跟踪和内存分析等。
一、安装gdb
在大多数Linux发行版中,gdb已经预装。如果没有安装,可以通过以下命令安装:
sudo apt-get install gdb
二、编译可调试的程序
为了进行调试,我们首先需要编译一个可调试的程序。在编译时,需要添加-g参数,以生成调试信息。例如,编译一个简单的C程序:
#include <stdio.h>int main() {int a = 5;int b = 0;int c = a / b;printf("Result: %d\n", c);return 0;
}
使用以下命令编译:
gcc -g -o debug_program debug_program.c
这将生成一个名为debug_program的可执行文件。
三、启动gdb调试
在命令行中输入以下命令启动gdb调试:
gdb debug_program
gdb将显示以下提示符:
(gdb)
四、设置断点
在程序中设置断点可以让我们在指定的位置停下来观察程序的状态。使用gdb的break命令可以设置断点。
例如,在main函数的第6行设置一个断点:
(gdb) break main.c:6
设置断点后,我们可以使用run命令运行程序:
(gdb) run
程序将运行到断点处停下来。
五、观察变量的值
在程序运行到断点处时,我们可以使用gdb的print命令观察变量的值。例如,我们想要查看变量a的值,可以输入以下命令:
(gdb) print a
gdb将显示变量a的值。
六、单步执行程序
使用gdb的next命令可以逐行执行程序。例如,输入以下命令:
(gdb) next
程序将执行下一行代码,并在执行完成后停下来。
七、观察堆栈
在调试过程中,我们经常需要观察函数调用的堆栈信息。使用gdb的backtrace命令可以显示当前的堆栈信息。例如,输入以下命令:
(gdb) backtrace
gdb将显示当前的堆栈信息。
八、修改变量的值
在调试过程中,有时我们需要修改变量的值以验证程序的行为。使用gdb的set命令可以修改变量的值。例如,我们想要将变量a的值修改为10,可以输入以下命令:
(gdb) set a = 10
变量a的值将被修改为10。
九、继续执行程序
使用gdb的continue命令可以继续执行程序,直到下一个断点或程序结束。例如,输入以下命令:
(gdb) continue
程序将继续执行。
十、条件断点
除了在特定行设置断点外,我们还可以设置条件断点,即只在满足特定条件时才停下来。使用gdb的break命令加上if关键字可以设置条件断点。例如,我们想要在变量a的值为5时停下来,可以输入以下命令:
(gdb) break main.c:6 if a == 5
当变量a的值为5时,程序将停在第6行。
十一、查看源代码
在调试过程中,我们可能需要查看源代码以更好地理解程序的逻辑。使用gdb的list命令可以显示当前位置周围的源代码。例如,输入以下命令:
(gdb) list
gdb将显示当前位置周围的源代码。
十二、查看内存内容
有时,我们需要查看程序运行时的内存内容。使用gdb的x命令可以查看内存的内容。例如,我们想要查看变量a的内存内容,可以输入以下命令:
(gdb) x &a
gdb将显示变量a的内存内容。
十三、调试崩溃程序
当程序崩溃时,我们可以使用gdb来进行调试。启动gdb并指定崩溃的程序,例如:
gdb -c core debug_program
gdb将加载core文件并显示崩溃时的堆栈信息。
十四、远程调试
在某些情况下,我们可能需要在远程机器上进行调试。使用gdb的target命令可以进行远程调试。例如,我们想要在IP地址为192.168.0.100的机器上调试程序,可以输入以下命令:
(gdb) target remote 192.168.0.100:1234
gdb将连接到远程机器并进行调试。
十五、调试多线程程序
在调试多线程程序时,我们可以使用gdb的thread命令来切换和观察不同的线程。例如,输入以下命令切换到线程1:
(gdb) thread 1
gdb将切换到线程1并显示相关信息。
十六、调试动态链接库
如果程序依赖于动态链接库,我们可以使用gdb来调试动态链接库中的代码。启动gdb并指定可执行文件和动态链接库,例如:
gdb debug_program -ex 'set solib-search-path /path/to/shared/library'
gdb将加载动态链接库并允许我们在其中进行调试。
十七、退出调试
当我们完成调试任务或者不再需要使用gdb时,可以使用gdb的quit命令退出调试。例如,输入以下命令:
(gdb) quit
gdb将退出调试模式并返回到终端。
另外,如果我们只是想临时中断调试而不退出gdb,可以使用gdb的detach命令。例如,输入以下命令:
(gdb) detach
gdb将与正在调试的程序分离,但仍保持运行状态。
总结:
本文详细介绍了Linux中gdb调试工具的使用方法,并通过实例演示了其调试功能。通过使用gdb,开发者可以更好地定位和解决程序中的bug,提高开发效率。
相关文章:
![](https://img-blog.csdnimg.cn/08af6424a459411190e6a3acdda67abc.png)
【Linux操作系统】深入了解系统编程gdb调试工具
在软件开发过程中,调试是一个非常重要的步骤。无论是在开发新的软件还是维护现有的代码,调试都是解决问题的关键。对于Linux开发者来说,GDB是一个非常有用的调试工具。在本文中,我们将探讨Linux中使用GDB进行调试的方法和技巧。 …...
![](https://img-blog.csdnimg.cn/c73e1b0e95af407cb46d604f568992db.png)
linux 安装go 1.18版本
首先去官网找到对应的版本 直接下载下来(如果服务器可以直接访问到go 官网也可以wget直接下载到服务器) 然后把该包上传到linux 的/usr/local 目录下 然后直接解压安装该包: sudo tar -C /usr/local -zxvf go1.18.10.linux-amd64.tar.gz 然…...
![](https://img-blog.csdnimg.cn/d19e25cb0e06415c8879297a9d5f0eef.png)
LLVM笔记2 Intermediate Representation (IR)
参考链接:https://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf https://zhuanlan.zhihu.com/p/163063995 https://zhuanlan.zhihu.com/p/163328574 文章目录 IR的布局1. IR语法2.IR递归函数3.使用迭代的方式4.全局变量5.LLVM’s type s…...
![](https://www.ngui.cc/images/no-images.jpg)
篇五:原型模式:复制对象的秘密
篇五:"原型模式:复制对象的秘密" 设计模式是软件开发中的重要组成部分,原型模式是创建型设计模式中的一种。原型模式旨在通过复制现有对象来创建新的对象,而不是通过调用构造函数来创建。在C中,原型模式广泛…...
![](https://www.ngui.cc/images/no-images.jpg)
为什么ip地址一直在变化
IP地址是计算机网络中用于唯一标识一台设备的二进制数字串。在互联网中,每台计算机都需要一个唯一的IP地址,以便与其他计算机进行通信。然而,有些情况下,IP地址可能会发生变化。 有多种原因可能导致IP地址发生变化。下面虎观代理…...
![](https://img-blog.csdnimg.cn/7c5c042381f8487bbeb7fcc2f71362ab.png)
10.物联网操作系统之低功耗管理
一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为: 1.备份域:备份电源,仔细在stm32的板子上寻找,大多都有纽扣电池。 注意:参考手册(PWR)章节有详细的介绍。 2.…...
![](https://img-blog.csdnimg.cn/img_convert/0fd1fc2de8577285b6b0854f5e8669b2.png)
SQL SERVER 2019 数据库还原测试库的方法
1、备份正式库数据 2、在其它电脑上还原备份的数据库 不需要覆盖其它数据库,直接还原出数据库 还原时修改文件名和数据库名称: 修改文件名称 还原成功...
![](https://img-blog.csdnimg.cn/6f6fa614562a4103ad9df29873ba9f68.jpeg)
leetcode 62. 不同路径
2023.8.8 用dp算法一遍过了,很舒服。 重点还是要确定dp数组的含义,本题的dp数组要设成二维的,dp[i][j]的含义是:到(i,j)这个点一共有多少种路径。由于题中说了m和n都大于1,所以假设一…...
![](https://img-blog.csdnimg.cn/a10a27147bc04641b37bddffa00a6e9c.png)
ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)
文章目录 1.常见的芯片类型2.数字隔离芯片有什么用?3.I2C的I/O扩展芯片说明4.16位I/O扩展芯片TCAL6416的features、applications、description5.TCAL6416的引脚功能6.TCAL6416的电气特性7.TCAL6416的典型特性(图像)8.TCAL6416的参数测量信息&…...
![](https://img-blog.csdnimg.cn/488bc11d39c24e339055531015cf2dbf.png)
fetch-github-hosts间隔一年大更新v2.6发布,多端支持
前言 fetch-github-hosts是一款同步 github hosts 的工具,用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间,最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新,同时也增加了一些实用的功能。 主要更新 更新了基础依…...
![](https://img-blog.csdnimg.cn/4e3d1d413e234342a1591db7136fa8f0.jpeg)
K最近邻算法:简单高效的分类和回归方法(三)
文章目录 🍀引言🍀训练集和测试集🍀sklearn中封装好的train_test_split🍀超参数 🍀引言 本节以KNN算法为主,简单介绍一下训练集和测试集、超参数 🍀训练集和测试集 训练集和测试集是机器学习和深…...
![](https://img-blog.csdnimg.cn/img_convert/daa7165e115fa274d7d0c934b0382c7f.png)
【数据分析专栏之Python篇】五、pandas数据结构之Series
前言 大家好!本期跟大家分享的知识是 Pandas 数据结构—Series。 一、Series的创建 Series 是一种类似于一维数组的对象,由下面两部分组成: values:一组数据,ndarray 类型index:数据索引 顾名思义&…...
![](https://img-blog.csdnimg.cn/img_convert/f702ed9c5ac9be14c284482a50e3c81f.png)
中间件多版本冲突的4种解决方案和我们的选择
背景 在小小的公司里面,挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用,需要在里面支持多个版本的中间件客户端;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT,百度,googl…...
![](https://www.ngui.cc/images/no-images.jpg)
对 async/await 的理解
async/await 的理解 async/await 其实是 Generator 的语法糖,它能实现的效果都能用then 链来实现,它是为优化 then 链而开发出来的。从字面上来看,async 是“异步”的简写,await 则为等待,所以很好理解async用于申明一…...
![](https://img-blog.csdnimg.cn/57c97dbee5214e998f14ba59d90c386c.png)
Vue 整合 Element UI 、路由嵌套、参数传递、重定向、404和路由钩子(五)
一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式,创建一个名为 hello-vue 的工程,命令为: # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化,记得一路的 no vue init webpack hello-vue 1.2 安装…...
![](https://www.ngui.cc/images/no-images.jpg)
修改 Ubuntu 系统的时区
修改 Ubuntu 系统的时区 如果 Ubuntu 系统的时区设置不正确,您可以按照以下步骤进行调整: 1. 查看当前的时区设置,可以使用以下命令: timedatectl 这将显示当前系统的日期、时间和时区信息。 2. 如果时区设置不正…...
![](https://img-blog.csdnimg.cn/2febb709a2924662a41f8a9d8e3c1e24.png)
如何离线安装ModHeader - Modify HTTP headers Chrome插件?
如何离线安装ModHeader - Modify HTTP headers Chrome插件? 1.1 前言1.2 打开Chrome浏览器的开发者模式1.3 下载并解压打包好的插件1.4 解压下载好的压缩包1.5 加载插件1.6 如何使用插件? 1.1 前言 ModHeader 是一个非常好用的Chrome浏览器插件,可以用…...
![](https://img-blog.csdnimg.cn/img_convert/1a8e8823417e2c289df822fd12bb9fb1.png)
在Linux中安装MySQL
在Linux中安装MySQL 检测当前系统中是否安装MySQL数据库 命令作用rpm -qa查询当前系统中安装的所有软件rpm -qa|grep mysql查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb查询当前系统中安装的名称带mariadb的软件 RPM ( Red-Hat Package Manager )RPM软件包管理…...
![](https://img-blog.csdnimg.cn/6a9cf64c9ac4475e86a8fbb41dc1fbbb.png)
python --windows获取启动文件夹路径/获取当前用户名/添加自启动文件
如何使用Python获取计算机用户名 一、Python自带的getpass模块可以用于获取用户输入的密码,但是它同样可以用来获取计算机用户名。 import getpassuser getpass.getuser() print("计算机用户名为:", user)二、使用os模块获取用户名 Python的…...
![](https://img-blog.csdnimg.cn/e47bb46aa26145edbe0a645bfdb4f3e4.png)
微信云托管(本地调试)⑥:nginx、vue刷新404问题
一、nginx默认路径 1.1、默认配置文件路径:/etc/nginx/nginx.conf 1.2、默认资源路径:/usr/share/nginx/html/index.html 二、修改nginx.conf配置 (注意配置中的:include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…...
![](https://img-blog.csdnimg.cn/81349588eebb45ab83e21455dd63950d.png)
数据结构 二叉树(一篇基本掌握)
绪论 雄关漫道真如铁,而今迈步从头越。 本章将开始学习二叉树(全文共一万两千字),二叉树相较于前面的数据结构来说难度会有许多的攀升,但只要跟着本篇博客深入的学习也可以基本的掌握基础二叉树。 话不多说安全带系好&…...
![](https://www.ngui.cc/images/no-images.jpg)
可视化绘图技巧100篇高级篇(四)-南丁格尔玫瑰图(二)
目录 前言 适用场景 不适用场景 堆积式南丁格尔玫瑰图( Nightingale Rose Diagram)...
![](https://img-blog.csdnimg.cn/853f98a8e57949478498d5f52405a9e0.png)
Stable Diffusion - Candy Land (糖果世界) LoRA 提示词配置与效果展示
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132145248 糖果世界 (Candy Land) 是一个充满甜蜜和奇幻的地方,由各种各样的糖果和巧克力构成。在糖果世界,可以看到&…...
![](https://www.ngui.cc/images/no-images.jpg)
ES6学习-module语法
Module语法 CommonJS模块 let { readfile } require(fs) # 等同于 let _fs require(fs) let readfile _fs.readfile //这种加载称为“运行时加载”ES6模块 import { stat, exists, readFile } from fs;这种加载称为“编译时加载”或者静态加载 静态加载带来的各种好处 …...
![](https://img-blog.csdnimg.cn/40b43cc94aa346f080026fb34c6f0458.gif)
Flutter 实现按位置大小比例布局的控件
文章目录 前言一、如何实现?1、数值转成分数2、RowFlexible布局横向3、ColumnFlexible布局纵向 二、完整代码三、使用示例1、基本用法2、四分屏3、六分屏4、八分屏5、九分屏6、414分屏 总结 前言 做视频监控项目时需要需要展示多分屏,比如2x2、3x3、414…...
![](https://img-blog.csdnimg.cn/c9a4526d0ae24ba1bdb9f15971643eec.png#pic_center)
ES6 - 对象新增的一些常用方法
文章目录 1,Object.is()2,Object.asign()3,Object.getOwnPropertyDescriptors()4,Object.setPrototypeOf()和getPrototypeOf()5,Object.keys()、values() 和 entries()6,Object.fromEntries()7,…...
![](https://img-blog.csdnimg.cn/e60a559fc07f4bb6afea55e33f644fb0.png)
半导体存储电路
存储电路 存储单元:只能存储一位数据 寄存器:存储一组数据 存储单元 静态存储单元:包含锁存器和触发器,只要不断电,静态存储单元的状态会一直保持下去。 动态存储单元:利用电容的电荷存储效应来存储数据。…...
![](https://img-blog.csdnimg.cn/02ec15ae43b843bd99bc67d455fb35e7.png)
web前端之CSS操作
文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件(适合单个事件)2.1.3 DOM2事件(适合多个事件) 2.2 事件之鼠标事件2.3 事件之Event事…...
![](https://img-blog.csdnimg.cn/e75b7d0ae26f4b47a13ee9f195d9b01e.jpeg)
Python SQLAlchemy ( ORM )
From Python中强大的通用ORM框架:SQLAlchemy:https://zhuanlan.zhihu.com/p/444930067Python ORM之SQLAlchemy全面指南:https://zhuanlan.zhihu.com/p/387078089 SQLAlchemy 文档:https://www.sqlalchemy.org/ SQLAlchemy入门和…...
![](https://img-blog.csdnimg.cn/img_convert/a3da07d86eec32da1b4d82534cb7c129.png)
鉴源实验室丨汽车网络安全运营
作者 | 苏少博 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 概 述 1.1 背景 随着车辆技术的不断进步和智能化水平的提升,车辆行业正经历着快速的变革和技术进步。智能化…...
![](https://img-blog.csdnimg.cn/img_convert/8fe32c52b196bfece54d2e616ed78c4e.png)
网站宣传片的创意/持啊传媒企业推广
2017年计算机二级C语言模拟试题及答案一、选择题1.一个C语言程序是由( )构成。A.语句B.行号C.数据D.函数2.下面标识符中正确的是( )。A.d&efB.6aC.z4x5cD.a3/b43.在C语言中,存储一个字符型、整型、单精度实型变量所需的空间是()。型、单精度实型变量所需的空间…...
![](https://img-blog.csdnimg.cn/20200719143913116.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dqaW5qaWU=,size_16,color_FFFFFF,t_70#pic_center)
wordpress 删除分类目录/深圳搜索引擎优化收费
大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、数据结构与算法、编程 等感兴趣,可以关注我的动态,我们一起学习&…...
![](https://img-blog.csdnimg.cn/d8ad9a64e6694981945bacd7d8cde110.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARmlybemZiA==,size_20,color_FFFFFF,t_70,g_se,x_16)
广告设计作品图片/seo优化教程下载
Spring Boot实战之Filter 1.Filter功能 filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实…...
![](/images/no-images.jpg)
为什么打开网站是建设中/重庆seo霸屏
Java break语句1 Java break语句某些时候需要在某种条件出现时强行终止循环,而不是等到循环条件为 false 时才退出循环。此时,可以使用 break 来完成这个功能。break 用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环…...
![](http://hi.csdn.net/attachment/201108/1/0_13121789685QY4.gif)
网站制作布局/线上推广的三种方式
OpenGL ES 03 – 转化今天,我们要在之前的基础 上,在屏幕上同时显示三角形和矩形。为了做到这点,我们需要移动它们。移动物体这个动作我们称之为转化。(坐标转换)在OpenGL ES中,对模型/物体进行…...
![](https://img-blog.csdnimg.cn/67e24140b77d4a779a75ded7b339bfd5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATWlja2V5X-S6jua1qQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
wordpress上传后设置/想做电商应该怎么入门
一. 准备 1. 苹果开发者账号(创建app) 2. 微信开放平台账号 (创建移动应用) 3. 微信公众平台账号(创建小程序) 4. uni-app 创建项目 5. Dcloud 开发者账号且实名认证 二. 实现 1. uniapp 配置 打开…...