GDB Tutorial

背景: 最近在重新学习操作系统,顺带重学一下C语言,GDB是C语言进行调试的工具,也就重新学一下GDB,本文没有什么创新只是记录所学内容,供以后翻阅和查询。

一、首先需要安装一系列软件

apt-get install build-essential    # build-essential packages, include binary utilities, gcc, make, and so on
apt-get install man                # on-line reference manual
apt-get install gcc-doc            # on-line reference manual for gcc
apt-get install gdb                # GNU debugger
apt-get install git                # revision control system
apt-get install libreadline-dev    # a library used later
apt-get install libsdl2-dev        # a library used later
apt-get install llvm llvm-dev      # llvm project, which contains libraries used later

二、案例程序

gcc -Wall -Werror  -g test.c -o test.out

-g 代表将生成带有调试信息的可执行文件,-o是输出

#include<stdio.h>int actual_calc(int a, int b){ int c;c=a/b;return 0;
}int calc(){int a;int b;a=13;b=0;actual_calc(a, b); return 0;
}
void output(){printf("this is a output\n");
}int main(){output();calc();return 0;
}

三、使用gdb

1. 加载程序

有两种方式:

$ gdb test.out

$ gdb

(gdb) file test.out 

2.运行程序

(gdb) run 或 r

3.设置断点

断点可以设置某一行,也可以设置某个函数

(gdb) break file1.c:6           // 将设置 file1.c文件的第6行

(gdb) break my_function    // 将设置my_function作为断点

(gdb) break file1.c:6 if i >= ARRAYSIZE    // 有条件的设置断点

break也可以简写为 b

(gdb) disable b                   // 关闭全部的断点

(gdb) enable b                    // 打开全部的断点 

4.查看所有断点

(gdb) info break

(gdb) info b

5. 删除断点

(gdb) delete Num               // Num为上一步查看断点的标号

(gdb) clear  函数名称         //  删除 函数名称 的断点

(gdb) clear 行号                 //  删除 行号 处的断点

6.设置观察点

(gdb) watch my_var           // 观察变量my_var是否变化,如有变化则停止程序并打印旧值和新值

7.继续运行

(gdb) continue 或 c             // 当遇到断点停下来的时候,使用continue或c使程序继续运行

8.打印变量

(gdb) print my_var               // 打印变量my_var的值

(gdb) print/x my_var             // 打印变量my_var的十六进制的值

(gdb) print p->key                 // 打印结构体指针的变量值

(gdb) print (*p).key                //  同上

(gdb) print p->name              // 打印结构体指针的变量值

(gdb) print (*p).name            // 同上

(gdb) print p                          // 打印指针的地址

(gdb) print *p                        // 打印指针所指向的值,或结构体的内容

print 也可以简写为 p

9. backtrace

(gdb) backtrace                    // 回溯,打印栈

(gdb) where

(gdb) finish

10. 执行一步

(gdb) step 

如果多次执行一步,可以使用 回车 替代输入,这样减少了很多输入的麻烦。

step 可简写为s  它会进入到各个函数中

next 可简写为n  它不会进入到各个函数中,而是当函数作为一条指令。

11. 显示代码

(gdb) list  或 l                 // 默认显示10行,回车显示其余的代码

(gdb) list 20                   // 显示第20行以及各前后5行的代码

(gdb) list 函数名            // 显示“函数名”所在函数的源代码

参考文献:

1. GDB, The GNU Debugger, By Example - Cprogramming.com

2. https://www.cs.umd.edu/~srhuang/teaching/cmsc212/gdb-tutorial-handout.pdf

3. GDB (Step by Step Introduction) - GeeksforGeeks

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

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

相关文章

按摩师(空间优化的动态规划算法)

一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师找到最优的预约集合&#xff08;总预约时间最长&#xff09;&#xff0c;…

Typora+Picgo(正常) 却上传图片失败问题解决思路和办法

报错信息 在typora中粘贴图片时报错&#xff0c;显示上传图片失败&#xff0c;有点奇怪&#xff0c;而我确定我的picgo正常且通过了测试&#xff0c;那我们就去看日志&#xff0c;跟踪排查问题在哪里 我的picgo日志文件路径在 D:\user\username\Application Data\picgo\picg…

Linux下Netty实现高性能UDP服务

前言 近期笔者基于Netty接收UDP报文进行业务数据统计的功能&#xff0c;因为Netty默认情况下处理UDP收包只能由一个线程负责&#xff0c;无法像TCP协议那种基于主从reactor模型实现多线程监听端口&#xff0c;所以笔者查阅网上资料查看是否有什么方式可以接收UDP收包的性能瓶颈…

如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cp…

Python的代码c语言可以用吗,python代码大全和用法

本篇文章给大家谈谈Python的代码c语言可以用吗&#xff0c;以及python代码大全和用法&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 深度学习的图片等比resize后&#xff0c;再把图片反向resize回来&#xff0c;验证通过 import cv2 import numpy as npdef …

python识别增强静脉清晰度 opencv-python图像处理案例

一.任务说明 用python实现静脉清晰度提升。 二.代码实现 import cv2 import numpy as npdef enhance_blood_vessels(image):# 调整图像对比度和亮度enhanced_image cv2.convertScaleAbs(image, alpha0.5, beta40)# 应用CLAHE&#xff08;对比度受限的自适应直方图均衡化&…

Java序列化、反序列化-为什么要使用序列化?Serializable接口的作用?

什么是序列化和反序列化&#xff1f; 把对象转换成字节序列把字节序列恢复成对象 结合OSI七层协议模型&#xff0c;序列化和反序列化是在那一层做的&#xff1f; 在OSI七层模型中&#xff0c;序列化工作的层级是表示层。这一层的主要功能包括把应用层的对象转换成一段连续的二进…

vue中用v-html根据后端返回结果设置样式

一、问题 1》今日遇到一个需求&#xff0c;是一个表格列返回状态status&#xff0c;并拥有多种不同颜色。 2》平日里见到的基本都是返回01234......前端用插槽放进去&#xff0c;根据数字去判断显示字段以及设置不同样式&#xff0c;今天看到的是后端直接返回一个字符串&#…

面试经典150题(27-28)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第十三天&#xff09;完成了2道(27-28)150&#xff1a; 今天这两道是真的汗流浃背&#xff01;&#xff01;&#xff01; 27.&#xff08;209. 长度最小的子数组&#xff09;题目描述&#xff1a; 给定一…

SpringBoot3 Web开发新特性(Problemdetails、函数式Web)

目录 1. Problemdetails2. 函数式Web2.1 场景2.2 主要逻辑2.3 核心对象2.4 示例程序 1. Problemdetails 错误信息返回新格式 package org.springframework.boot.autoconfigure.web.servlet; ......省略部分...... public class WebMvcAutoConfiguration {......省略部分.....…

Leetcode 2967. Minimum Cost to Make Array Equalindromic

Leetcode 2967. Minimum Cost to Make Array Equalindromic 1. 解题思路2. 代码实现 题目链接&#xff1a;2967. Minimum Cost to Make Array Equalindromic 1. 解题思路 这一题其实我的思路有点笨&#xff0c;多少有点暴力求解的意思。 显然&#xff0c;如果我们给出全部的…

PCL 点云半径查找

目录 一、 算法概述二、代码实现三、测试示例一、 算法概述 适用:根据已知点坐标,在点云中搜索其指定半径范围内的所有点云。 二、代码实现 #include <iostream> #include <vector> #include <

如何搭建企业管理系统Odoo并远程访问管理界面【内网穿透】

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

涉及知识点 双指针 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] …

【云原生之Docker实战】Docker环境下部署群晖DSM系统(详细教程)

【云原生之Docker实战】Docker环境下部署群晖DSM系统(详细教程) 一、Virtual DSM介绍2.1 Virtual DSM特点二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、环境准备工作4.1 检查c…

STL技术概述与入门

STL技术概述与入门 STL介绍STL六大组件初识容器算法迭代器1. vector存放内置数据类型2. Vector存放自定义数据类型3. Vector容器的嵌套 ✨ 总结 参考博文1&#xff1a;STL技术——STL概述和入门 参考博文2&#xff1a;&#xff1c;C&#xff1e;初识STL —— 标准模板库 STL介…

Android开发中pcm格式的音频转换为wav格式之二

上篇Android开发中pcm格式的音频转换为wav格式的工具类-CSDN博客文章讲解了pcm格式的音频转换为wav格式&#xff0c;这篇文章主要讲解怎么使用&#xff1a; 我们先来说明一下怎么播放一个wav文件 /*** 播放一个wav文件*/public static void playWav(String filePath){File wav…

SpringBoot配置mysql加密之Druid方式

一、导入Druid依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version> </dependency>二、生成密文 方式1. 找到存放druid jar包的目录 1-1、在目录…

【Proteus仿真】【Arduino单片机】电子称重秤

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;矩阵按键、蜂鸣器、HX711称重模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示HX711称重模块检测重量…

kafka设置消费者组

安装部署后 consumer.properties group.idtest-group 单机测试&#xff0c;自己开俩窗口&#xff0c;一个测试消费者&#xff0c;一个测试生产者&#xff08;创建消息那步&#xff09; 创建主题 bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replica…