GDB代码调试---实战版

news2024/9/20 8:55:02

一、GDB

(1)GDB是什么

GDB(GNU Debugger)是一个功能强大的调试器,它可以用来帮助你查看另一个程序在执行时“内部”发生了什么。你可以使用GDB来执行你的程序,设置断点(在某一行停止执行),在程序执行时检查变量的值,以及查看程序崩溃时的堆栈跟踪。

(2)为什么学习GDB很重要?

  • 解决问题:当程序出现问题时,GDB可以帮助你快速定位错误所在,节省你大量的调试时间。
  • 深入理解:通过GDB,你可以更深入地了解程序是如何运行的,这有助于提高你的编程技能。
  • 职业发展:掌握GDB是成为专业程序员的重要一步,它显示了你对代码质量的重视。

(3)GDB能做什么?

  • 设置断点:就像在迷宫中放置标记,告诉程序在哪里暂停,让你有机会检查情况。
  • 单步执行:一步一步地执行代码,观察每一步的结果。
  • 查看变量:在程序的任何时刻,检查变量的值,就像使用X光透视程序的心脏。
  • 堆栈跟踪:当你迷失在函数调用的大海中时,GDB可以帮助你找到回家的路。

二、GDB调试命令

以下是一些常用的GDB调试命令:

  • break [file:]function 或 b [file:]function:在指定的函数上设置断点。
  • break [file:]line 或 b [file:]line:在指定文件的指定行上设置断点。
  • run 或 r:开始执行程序。
  • next 或 n:执行下一行代码,但不进入函数内部。
  • step 或 s:执行下一行代码,如果是函数则进入函数内部。
  • continue 或 c:继续执行程序,直到下一个断点。
  • quit 或 q:退出GDB。

三、GDB实战

(1)下列代码存在内存泄露问题

#include <stdio.h>
#include <stdlib.h>

void function_that_causes_null_pointer_exception() 
{
    int *null_pointer = NULL;
    printf("Value at null pointer: %d\n", *null_pointer);
}

void safe_function() 
{
    int *ptr = malloc(sizeof(int));
    if (ptr == NULL) 
    {
        fprintf(stderr, "Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    *ptr = 42;
    printf("Value stored safely: %d\n", *ptr);
    free(ptr);
}

int main() 
{
    printf("Program starts.\n");
    safe_function();
    function_that_causes_null_pointer_exception();
    printf("This line may not be executed.\n");
    printf("Program ends.\n");
    return 0;
}

(2)GDB调试实战

=======================调试过程图放到最后=======================
(1)gcc test.c -o test -g  使用-g选项编译程序,使程序具备可调试功能
(2)gdb ./test 调试可执行程序
(3)在main、line 26 27打上断点,
26行为safe_function()函数,27行为function_that_causes_null_pointer_exception()函数
这是进行函数级别的代码错误排查。
(4)
(5)

gdb ./test运行结果图
在这里插入图片描述b mian、b 26、b 27打断点图
在这里插入图片描述
分别按r n n n后的运行结果图
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/67651aebb2594071838d88945de35a77.png

(1)按r并回车后,因为在main处打了断点,因此函数执行到25行停下;下一步是要执行打印函数printf("Program starts.\n");
(2)按n后意味着单步执行不进入函数内部,可以看到打印出Program starts.意味着打印函数执行完毕;
下一步是执行safe_function()函数
(3)n:执行safe_function()完毕,打印出Value stored safely: 42,意味着该函数正常运行不存在内存泄露问题;
下一步执行function_that_causes_null_pointer_exception()函数
(4)n:执行function_that_causes_null_pointer_exception()函数,报错提示段错误,定位内存泄露问题存在于该函数。
我们知道问题所在后退出调试重新打断点;直接b 27在该函数处打断点,并按c进入内部执行。

二次调试过程
在这里插入图片描述

分别按s n n后的运行结果图
在这里插入图片描述

(1)按s进入function_that_causes_null_pointer_exception()函数内部执行,下一步执行int *null_pointer = NULL
(2)按n意味着int *null_pointer = NULL执行完毕,下一步执行printf("Value at null pointer: %d\n", *null_pointer);
(3)按n继续执行,这里报错,这个打印函数想要打印指针null_pointer的值,这里我们检查一下发现null_pointer初始化时赋值为NULL。那么显而易见:这是一个常见的空指针访问异常问题,排查完毕。

如果你喜欢这篇文章,别忘了点赞收藏,给个关注哦!一键三连,你的支持是我创作的最大动力。让我们共同成长,探索更多精彩内容,期待你的每一次回眸!

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

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

相关文章

【C++】模版初阶+STL简介

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言&#x1f4a5;1、函数模版&#x1f4a5;1.1 函数模板概念&#x1f4a5;1.2 函数模板格式&#x1f4a5;1…

pydal,一个实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个实用的 Python 库 - pydal。 Github地址&#xff1a;https://github.com/web2py/pydal/ 在现代应用开发中&#xff0c;数据库操作是一个核心部分。为了简化与数据库的交互…

支持 ESXi 8.0 的第 14 代 Intel 酷睿处理器选购参考

Intel 最新发布的第 14 代酷睿处理器全面支持 ESXi 8.0 支持 ESXi 8.0 的第 14 代 Intel 酷睿处理器选购参考 请访问原文链接&#xff1a;https://sysin.org/blog/intel-core-14th-gen-cpu-for-esxi/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 Intel 最新…

AI大模型在数据治理中的应用

目前&#xff0c;企业的数据治理工作以人工实施为主&#xff0c;其中一些重复性较强的工作&#xff0c;如&#xff1a;数据标准制定和映射、元数据信息完善、数据目录挂载等&#xff0c;需要消耗大量的人力和时间成本&#xff0c;这给本来就难以量化业务价值的治理工作的顺利推…

[Java]面向对象

快速入门 计算机的核心作用就是处理数据, 变量用来存储单个数据, 数组用来储存一批数据, 对象用来存储一类数据 什么是对象: 对象就是一种特殊的数据结构, 在java中万物皆对象 面相对象编程的好处: 更加符合人类思维习惯 类和实例对象 在java中必须先设计类, 才能根据类创…

Python基本命令、函数、以及小项目

目录 1.基本操作 1.1 例子 1.2 输出结果 2.数据结构 2.1 例子 2.2 输出结果 3.字符串操作 3.1 例子 3.2 输出结果 4.文件操作 4.1 例子 4.2 输出结果 5.数学操作 5.1 例子 5.2 输出结果 6.模块导入 6.1 例子 6.2 输出结果 7.控制结构 7.1例子 输出结果 7…

Flink-StarRocks详解:第五部分查询数据湖(第55天)

系列文章目录 4.查询数据湖 4.1 Catalog 4.1.1 概述 4.1.1.1 基本概念 4.1.1.2 Catalog 4.1.1.3 访问Catalog 4.1.2 Default catalog 4.1.3 External Catalog 4.2 文件外部表 4.2.1 使用限制 4.2.2 开源版本语法 4.2.3 阿里云版本 5. 查询及优化 文章目录 系列文章目录前言4.查…

Java(十一)——内部类、成员内部类、静态内部类、局部内部类、匿名内部类

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

操作系统原理:程序、进程、线程的概念

文章目录 程序、进程、线程的概念程序&#xff08;Program&#xff09;进程&#xff08;Process&#xff09;线程&#xff08;Thread&#xff09;关系总结 在日常对操作系统的使用中&#xff0c;大家肯定对程序、进程和线程多少有所耳闻。作为操作系统的重要一部分&#xff0c;…

ROM修改进阶教程------修改自己适配的rom固件 禁止第三方修改 删除自定文件或app后自动重启的步骤解析

很多适配第三方系统的资深作者。都会在rom中加入一些防止他人任意修改的脚本。这种操作主要避免盗包的行为。而且前期有在rom中加入联网锁定id格式化分区的恶意操作。今天主要解析一种删除自带文件后重启手机后会反复重启的脚本步骤。 通过博文步骤可以初步了解; 1----了解删…

CAPL代码中判断网络是CAN还是CANFD

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

ardupilot开发 --- 网络技术综述 篇

不信人间有白头 一些概念参考文献 一些概念 以太网、局域网、互联网 以太网(Ethernet)&#xff0c;是一种计算机局域网技术。以太网是一种有线网络技术&#xff0c;网络传输介质包括&#xff1a;以太网电缆&#xff0c;如常见的双绞线、光纤等。根据传输速度&#xff0c;可以氛…

2024107读书笔记|《火车快开(李娟诗集)》——我轰然经过你的生命,又悄然退却,你从不曾爱过我,你只爱我在你的生命中坠落

《火车快开&#xff08;李娟诗集&#xff09;》—— 文前第一部分 荒野碎片第二部分 弯路第三部分 告别 《火车快开&#xff08;李娟诗集&#xff09;》作者李娟&#xff0c;看的她的第一本书是《记一忘二三》&#xff0c;前段时间《我的阿勒泰》超级火&#xff0c;但我终于还是…

Codeforces Round 962 (Div. 3) A~F

A.Legs&#xff08;贪心&#xff09; 题意&#xff1a; 农夫约翰的农场又迎来了美好的一天。 农夫约翰来到农场后&#xff0c;数了数共 n n n条腿。众所周知&#xff0c;农场里只住着鸡和牛&#xff0c;一只鸡有 2 2 2条腿&#xff0c;而一头牛有 4 4 4条腿。 假设约翰农场…

Shell编程 --基础语法(1)

文章目录 Shell编程基础语法变量定义变量使用变量命令的使用只读变量删除变量 传递参数字符串获取字符串长度字符串截取 数组定义方式关联数组获取数组的长度 总结 Shell编程 Shell是一种程序设计语言。作为命令语言&#xff0c;它交互式解释和执行用户输入的命令或者自动地解…

数论——裴蜀定理、欧几里得算法、扩展欧几里得算法、逆元以及求解

裴蜀定理 若整数 a、b 互质&#xff08;最大公约数为 1&#xff09;&#xff0c;则存在整数 x、y &#xff0c;使得 ax by 1 。 更一般的情况是&#xff1a;设 a、b 是不全为零的整数&#xff0c;则存在整数 x、y &#xff0c;使得 ax by gcd(a, b) &#xff0c;其中 gcd…

第十一章:Kubernetes API服务器的安全防护

本章内容包括&#xff1a; 了解认证机制ServiceAccounts是什么及使用的原因了解基于角色(RBAC)的权限控制插件使用角色和角色绑定使用集群角色和集群角色绑定了解默认角色及其绑定 1 了解认证机制 在前面的内容中&#xff0c;我们说到API服务器可以配置一个到多个认证的插件(授…

等保2.0 | 人大金仓数据库测评

人大金仓数据库&#xff0c;全称为金仓数据库管理系统KingbaseES&#xff08;简称&#xff1a;金仓数据库或KingbaseES&#xff09;&#xff0c;是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。以下是关于人大金仓数据库的详细…

室内养宠空气净化器哪家好?热门室内养宠空气净化器用户体验

自从家里有了4只英短后&#xff0c;一到季节我就得不停的拖地刷床&#xff0c;除了这些可以手动清理的猫毛之外&#xff0c;那么空气中的猫毛怎么办&#xff1f;真的不建议养猫&#xff0c;除非你能接受空气中飞舞着浮毛&#xff0c;衣服、床、筷子、鼻子里全都是猫毛&#xff…

STM32——外部中断(EXTI)

目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断&#xff08;External Interrupt&#xff0c;简称EXTI&#xff09;是微控制器用于响应外部事件的一种方式&#xff0c;当外部事件发生时&#xff08;如按键按下、传感器信号…