Linux调试工具GDB(1)

news2024/11/25 17:34:09

文章目录

  • 前言
  • 一、GDB概念
  • 二、GDB具体使用方法
  • 三、GDB断点类型
  • 总结


前言

本篇文章我们来介绍一下Linux中的调试利器GDB工具,在Linux的调试中GDB可以帮助我们来解决非常多的问题。

一、GDB概念

GDB是一个功能强大的调试工具,可以用于分析程序崩溃,跟踪程序执行过程,查看内存和寄存器状态等。以下是使用 GDB 进行基本调试的步骤和命令:

1.编译程序并使用 -g 参数开启调试信息

在使用 GDB 进行调试前,需要在编译程序时添加 -g 参数开启调试信息。

gcc -g -o program program.c

2.启动GDB

在 shell 中输入 gdb 命令来启动 GDB 调试器,并将编译的程序作为参数传递给 GDB。

gdb program

3.设置断点

使用 break 命令设置断点,可以暂停程序的执行并进入调试模式。

(gdb) break main

4.运行程序

使用 run 命令运行程序,并执行到设定的断点处。程序停止运行并在 GDB 控制台显示为 (gdb)。

(gdb) run

5.打印变量值

使用 print 命令可以查看变量的值。

(gdb) print variable_name

6.单步执行

使用 step 命令执行程序的当前行,并进入函数的内部。

(gdb) step

7.继续执行

使用 continue 命令继续执行程序,直到程序结束或下一个断点位置。

(gdb) continue

8.进入汇编模式

使用 disassemble 命令可以在 GDB 控制台显示当前代码的汇编指令。

(gdb) disassemble

9.退出 GDB

使用 quit 命令可以退出 GDB 调试器。

(gdb) quit

以上是 GDB 的一些基本命令和使用方法,如果需要更多命令,请查阅 GDB 的官方文档或者使用 help 命令查看 GDB 命令列表。

二、GDB具体使用方法

首先编写一个测试代码:

#include <stdio.h>

int *g_pointer;

void func(void)
{
    *g_pointer = (int)"Hello World";
}

int main(void)
{
    func();

    return 0;
}

编译时加上-g选项:
在这里插入图片描述
运行程序:
运行后直接崩溃了,这个时候我们就可以来使用GDB来调试我们的代码了。
在这里插入图片描述
启动GDB调试后直接就可以找到问题出现的地方了:
在这里插入图片描述
GDB也可以传递参数:

#include <stdio.h>

int main(int argc, char** argv)
{
    printf("argv : %s\n", argv[0]);
    printf("argv : %s\n", argv[1]);
    printf("argv : %s\n", argv[2]);

    return 0;
}

执行GDB命令传递参数:
在这里插入图片描述
这样传递参数的方式相当于:
在这里插入图片描述
在执行GDB来让程序运行的时候也可以使用ctrl加c来打断程序的执行。使用continue来让程序继续运行:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int i = 0;

    for(i = 0; i < 10; i++)
    {
        printf("i = %d\n", i);
        sleep(1);
    }

    return 0;
}

在这里插入图片描述

三、GDB断点类型

软件断点:

软件断点也称为“内存断点”,这类断点是通过修改对应指令的内存地址进行实现的。换句话说,这些断点不会占用处理器的硬件资源。因此,在同一时间点上,GDB 可以设置许多软件断点,而不用担心硬件反应带来的性能开销。

当程序执行到设定断点的地址时,会首先检查这个地址是否被设置了断点,如若设置了,CPU会停下来执行相应的调试操作。由于软件断点是通过对指令地址进行修改实现的,因此断点会覆盖指令地址,并且在断点被移除之后,程序可以恢复执行。

硬件断点:

硬件断点是由调试器设置的硬件的断点条件。它利用处理器的硬件调试功能,避免了软件断点导致增加程序的执行开销。硬件断点是设置在程序指令地址上的,使用了特殊的断点寄存器来识别局部读写操作。

数据断点:
数据断点也称为“监视点”,是一种特殊的硬件断点,用于监视内存中特定的变量或内存地址。当被监视的变量或内存地址被读或写时,GDB 便会停下程序以进行调试。

设置软件断点:
在 GDB 中,可以通过 break 命令来设置软件断点。具体语法为:

break [location]

其中,location 可以是代码行号、函数名、函数地址等。例如:

(gdb) break main.c:10  # 在 main.c 文件的第 10 行设置断点
(gdb) break function   # 在 function 函数入口处设置断点
(gdb) break *address   # 在地址为 address 处设置断点

如果省略 location,则会在当前行设置断点:

(gdb) break   # 在当前行设置断点

设置断点后,可以使用 run 命令运行程序。当程序执行到断点处时,程序会停止执行,并进入 GDB 调试界面。

使用next可以执行下一条语句
在这里插入图片描述
使用info breakpoints命令可以查看到当前的断点信息:
在这里插入图片描述
使用delete可以删除断点:
在这里插入图片描述
删除完成断点后代码就会向下执行了。

通过print命令可以查看到变量的信息:
在这里插入图片描述
当然了也可以进行变量的设置:
在这里插入图片描述

总结

本篇文章我们就讲解到这里,熟练使用GDB工具将给我们带来极大的便利。

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

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

相关文章

temporal简介

文章目录 前言一、temporal是什么&#xff1f;二、使用步骤1.执行以下命令以启动预构建映像以及所有依赖项。2.运行示例 总结 前言 这两天在国外的网站发现了一个新的golang的微服务框架&#xff0c;感觉挺不错&#xff0c;分亨出来&#xff0c;大家一起看看。 一、temporal是…

python:并发编程(四)

前言 本文将和大家一起探讨python的多进程并发编程&#xff0c;使用内置基本库multiprocessing来实现并发&#xff0c;先通过官方来简单使用这个模块。先打好基础&#xff0c;能够有个基本的用法与认知&#xff0c;后续文章&#xff0c;我们再进行详细使用。 本文为python并发…

【数据库原理与应用 - 第四章】关系数据库规范化理论

目录 一、关系模式规范化理论 1、关系模式规范化概念 2、关系模式应满足的基本要求 3、关系规范化的意义 &#xff08;1&#xff09;一个好的数据库应遵循的标准 &#xff08;2&#xff09;规范化的意义 二、函数依赖 1、函数依赖的概念 &#xff08;1&#xff09;平凡…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(五)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

学生成绩管理系统(逻辑清楚-简单实用)

1、需求分析 1.1、需求分析概述 需求分析是我们在软件开发中的重要环节&#xff0c;是软件开发的第一步也是最基础的环节&#xff0c;这将决定我们所实现的目标以及系统的各个组成部分、各部分的任务职能、以及使用到的数据结构、各个部门之间的组成关系和数据流程&#xff0…

chatgpt赋能python:Python列表操作:如何使用Python将数据放入列表中

Python列表操作&#xff1a;如何使用Python将数据放入列表中 在Python中&#xff0c;列表是一种重要的数据结构&#xff0c;允许我们将多个项目存储在单个变量中。在本文中&#xff0c;我们将介绍如何将数据放入Python列表中。我们将讨论Python中的列表数据类型以及如何向列表…

chatgpt赋能python:Python中如何放大图片

Python中如何放大图片 简介 图片是网站优化中不可或缺的一部分&#xff0c;然而&#xff0c;当图片在网站中被缩小或拉伸时&#xff0c;会导致其模糊或失真。在这种情况下&#xff0c;可以使用Python中的一些库来放大图片&#xff0c;同时保持图像的清晰度和质量。在本篇文章…

JavaScript 进阶 - 第3天

文章目录 JavaScript 进阶 - 第3天1 编程思想1.1 面向过程1.2 面向对象&#xff08;oop&#xff09; 2 构造函数3 原型对象3.1 原型3.2 constructor 属性3.3 对象原型3.4 原型继承3.5 原型链&#xff08;面试高频&#xff09; JavaScript 进阶 - 第3天 了解构造函数原型对象的语…

C++友元函数friend使用的学习总结

C友元函数friend使用的学习总结 1. 友元函数简介1.1 使用友元函数的目的1.2 友元函数的三种实现方法 2.全局函数做友元3.类做友元4.成员函数做友元注意&#xff01; 1. 友元函数简介 1.1 使用友元函数的目的 允许一个函数或者类访问另一个类中的私有成员,使得两个类可以共享同…

HTML学习(一)

Web标准 主要包括&#xff1a;结构&#xff0c;外观&#xff0c;行为三个方面 HTML标签&#xff0c;把标签学会&#xff0c;这门语言就基本学会了 双标签的关系&#xff0c;并列关系和包含关系 每个标签起作用的位置 vscode自动生成的代码的解释 <!DOCTYPE>文档类型声…

【RabbitMQ教程】第八章 —— RabbitMQ - 幂等性、优先级、惰性

&#x1f4a7; 【 R a b b i t M Q 教程】第八章—— R a b b i t M Q − 幂等性、优先级、惰性 \color{#FF1493}{【RabbitMQ教程】第八章 —— RabbitMQ - 幂等性、优先级、惰性} 【RabbitMQ教程】第八章——RabbitMQ−幂等性、优先级、惰性&#x1f4a7; &#x1f…

chatgpt赋能python:Python调试技巧:如何使用断点运行程序

Python调试技巧&#xff1a;如何使用断点运行程序 在Python编程中&#xff0c;程序出现错误或需要调试时&#xff0c;我们需要一些工具来帮助我们定位问题和修复代码。其中之一就是使用断点来运行程序。接下来我们将讨论如何在Python中使用断点进行程序调试的相关技巧。 什么…

C++11核心特性---右值引用(代码+讲解)

右值引用C11 1.左值和右值2.左值引用3.右值引用4.右值引用的性能优化空间5.移动语义6.值类别7.将左值转化为右值8.万能引用和引用折叠9.完美转发10.针对局部变量和右值引用的隐士类型转换11.总结 今天看到谢丙堃老师的《现代C语言核心特性解析》一书中关于右值引用的介绍&#…

21.网络编程|Java学习笔记

文章目录 网络的相关概念ipv4地址分类网路通信协议TCP和UDP InetAdress类SocketTCP网络通信编程应用案例服务端客户端 netstat指令TCP网络通讯不为人知的秘密 UDP网络通信编程【了解】网络传输文件代码示例 网络的相关概念 网络通信 网络 ip地址 1. 概念:用于唯一标识网络…

【数据库原理与应用 - 第七章】数据库安全性和完整性控制

目录 一、数据库安全性控制 二、数据库完整性控制 三、课后习题 数据库的保护功能&#xff1a;数据库安全性、完整性、数据库恢复、并发控制 一、数据库安全性控制 数据库的安全性&#xff1a;保护数据库&#xff0c;以防止非授权用户非法存取造成的数据泄密、更改、破坏DBM…

Python开发中的常见问题和解决方法:如何解决常见的性能和bug问题

第一章&#xff1a;引言 在Python开发中&#xff0c;我们经常会遇到一些常见的问题&#xff0c;包括性能瓶颈和程序错误&#xff08;bug&#xff09;。这些问题可能会影响我们的应用程序的运行效率和稳定性。因此&#xff0c;了解这些问题的根源并学习解决方法是非常重要的。本…

IDEA集成GitHub - Gitee集成

GitHub 集成 实际的开发中&#xff0c;代码都是采用IDE进行开发&#xff0c;所以我们这里介绍一下IDEA软件是如何集成GitHub远程仓库进行代码版本控制的。这里采用的IDEA版本为2022.2.1,其他版本的IDEA软件会略有差别。 1、 配置 Git 软件 2、 配置 GitHub 账号 继续点授权按…

三.数据类型

目录 1、布尔类型 2、整数类型 3、浮点数类型 4、字符类型 5、字符串类型 6、类型转换 1、布尔类型 Go语言中的布尔类型与其他语言基本一致&#xff0c;关键字也为bool&#xff0c;可赋值为预定义的true和false 示例代码如下&#xff1a; var v1 bool v1 true v2 :…

【TCP/IP】利用I/O复用技术实现并发服务器 - select函数

目录 I/O复用技术 select函数 设置文件描述符 指定监视范围 设置超时 I/O复用服务器端的实现 由服务器创建多个进程来实现并发的做法有时会带来一些问题&#xff0c;比如&#xff1a;内存上的开销、CPU的大量占用等&#xff0c;这些因素会消耗掉服务器端有限的计算资源、…

chatgpt赋能python:Python中如何更新pip版本

Python中如何更新pip版本 Python是一种非常强大的编程语言&#xff0c;它在现代编程领域中广泛使用。使用Python的好处之一是能够轻松地在其上安装和使用各种库&#xff0c;其中许多库由Python包管理器pip&#xff08;pip-installs-packages&#xff09;提供。尽管pip可以使Py…