[GDB] GDB调试

目录

一 简介

二 功能:

三 命令:

四 调试准备:

五 开始调试:

5.1 添加断点:

5.2 条件编译

5.3 断点查看

5.4 断点删除:

5.5 查看源码

5.6 单步调试(逐过程):

5.7 断点调试:

5.8 单步跟踪(逐语句):

5.9 调试过程:

5.9.1 开始调试

5.9.2 查看变量 

5.9.3 显示变量:

5.9.4 监控变量:

5.9.5 设置变量:

六 段错误追踪

6.1 设置核心文件大小:

6.2 设置核心文件路径:

6.3 追踪核心文件:


一 简介

  • UNIX及UNIX-like下的调试工具。虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,能够让用户在程序运行时观察程序的内部结构和内存的使用情况。

二 功能:

GDB的功能很是强大,主要列出了几点常用且重要的。要值得注意的是只有debug程序可以进行GBD调试,如果是releas程序是不可以进行调试的。

  • 条件调试:  可以自定义断点的调试方式,以及触发条件等。
  • 变量监视:  可以动态的监视某个值的变化
  • 动态改变程序执行环境:可以在断点处修改程序目前变量的值,从而在不重新运行程序的情况下,用预期的值来进行调试。
  • 分析上下文: 可以分析出程序目前的上下文堆栈调用情况
  • 段错误分析: 这个是个很重要的点,可以帮助我们找到程序崩溃的源码。

三 命令:

命令作用使用方式
gdb进入调试环境gdb 可执行文件名 
r(run)重新开始运行可执行文件r或者run
b(break)设置断点,可以针对不同文件,函数名设置b或者break
info b查看断点信息info b 或者info break
d删除断点d 断点编号
d break删除所有断点d break不能使用d b
disable/enable 使断点无效/有效

指定断点无效:disable 断点编号 

使所有断点无效: disable b

n(next)逐过程,相当于F10,不会进入函数体.单步执行n或者n 【数字】 可以一步也可以指定多步
s(step)逐语句【相当于F11,所有语句都会进入s或者s 【数字】 可以一步也可以指定多步
c(continue)从一个断点处,直接运行至下一个断点处【F5】c
p打印变量名

p 【变量名】

四 调试准备:

  • 首先我们准备一段测试demo。
#include <stdio.h>

// 一个简单的函数,用于演示函数调用
void print_message(const char* message) {

    int i = 0;
    for(i = 0; i < 10; ++i)
    {
        printf("%d+%s\n", i, message);
    }
}

int main() {
    // 未初始化的指针
    char* ptr = (char*)malloc(50);

    // 尝试打印通过未初始化指针指向的数据,这将导致段错误
    printf("The secret message is: %s\n", ptr);

    // 正常情况下会调用此函数,但由于前面的段错误,可能无法执行到
    print_message("This message should never appear");

    return 0;
}
  • 首先我们不带编译信息来编译这段程序,也就是release模式
  • 然后我们使用gdb main命令来进行调试这个可执行程序
  • 这时候我么会发现,No debugging symbols found in main),表示这个可执行程序并不能够进行调试。

gcc main.c -o main

  • 所以在编译时我们应该加上-g选项,如果是其他编译工具,对应的生成debug下的可执行文件即可。
  • 这时候Reading symbols from main... 就表示可以进行调试了。

  • 还有两种方式也能够查看:使用readelf和objdump命令

五 开始调试:

  • 使用gdb main(对应自己可执行程序文件)
  • 设置断点: 如果未设置调试信息(断点)直接输入r(运行程序),那么就会和正常运行程序一样,直到程序结束。

5.1 添加断点:

有两种方式一种是指定行号,一种是指定函数名。

  • break 文件名:行号      如果不写文件名那么会在主函数的对应行号设置断点
  • break 文件名:函数名  如果不写文件名GBD会找到项目整个目录中所有包含这个函数名的地方并打上断点

这里我们分别使用两种方式打上两个断点,对于vi编辑器如果不知道行号我们可以在命令模式下输入

set number命令这样就可以看到行号了。

5.2 条件编译

  • 对于断点调试是可以进行设置条件断点的。
  • break 文件名: 行号 条件
  • 下面这个条件编译也就是当这个指针等于0时才会触发这个断点。

5.3 断点查看

  • info b: 可以看到断点编号 位置等信息
Num断点唯一标识号
Type断点的类型,比如全程序断点、条件断点、指令断点等。
Disp表示断点的处理方式。例如,keep表示即使断点被命中,它也不会被自动删除;del则会在首次命中后删除断点。
Enb表明断点是否启用。y表示启用,n表示禁用。
Address断点所在代码的地址。
What断点关联的具体位置,可以是源代码文件名和行号,或者是函数名,甚至是内存地址。
Cond如果设置了条件断点,这里会显示该条件表达式
Times断点被触发的次数

5.4 断点删除:

  • d 断点编号: d 后面跟上断点编号
  • d break : 删除所有断点,这里会提示是否全部删除

5.5 查看源码

  • l:  list 默认查看从第一行到20行前20行代码,后续可以直接按下回车查看后面代码,GDB会默认记住上一次的命令
  • l 10,20: 查看第10行到第20行的代码,也就是指定行号
  • l main.c:print_message: 查看main.c文件中的print_message函数的代码
  • l main.c:20: 查看main.c 中第20行的代码(默认从此处后20行)
  • l main.c:10,20: 同理查看main.c文件中第10到20行代码

5.6 单步调试(逐过程):

  • n: next 从这个断点执行一行源程序代码,遇到函数也会直接调用并执行,不会进入函数.
  • n 数字: 单步执行多少行,比如你确认下面的几行是没有问题的,你就可以直接跳过。

这里要注意的是在设置函数的断点时,如果是使用的是 break 函数名设置的断点,使用n是仍然会进入函数的,如果是使用break + 数字(这个函数所在的行号) 这样是可以跳过的。如果这样设置了我们可以利用s 函数名 或者 n 数字 这种方式也可以直接跳出函数。

5.7 断点调试:

  • c:continue 会直接跳转到下一个断点处进行调试。

5.8 单步跟踪(逐语句):

  • s:skip 执行一行源代码程序,但是如果遇到函数调用,会进入该函数
  • s 函数名: 跳出该函数

5.9 调试过程:

5.9.1 开始调试

  • 输入r开始运行程序,此时会在程序遇到的第一个断点处停下

5.9.2 查看变量 

  • print 变量名: 此时我们可以使用print来查看变量值
  • print 函数名:变量名: 如果多个函数有同一个变量名我们需要前面加上函数名来区分
  • print *ptr: 如果这个值是指针那么我们看到的将是地址,想要查看它的值我们需要解引用: 
  • 这里我们看到ptr的值是等于0的,这样恰好验证了我们当时的条件编译,如果我们不做初始化ptr那么此时ptr不等于0那么断点也就不会触发。

5.9.3 显示变量:

  • display 变量: 跟踪查看一个变量,每次停下来都会显示它的值。

5.9.4 监控变量:

  • watch 变量名: 这样在这个变量名改变时程序就会停下来,其实这也是一个断点,我们可以此时查看断点信息,就会发现它也生成了一个断点。

5.9.5 设置变量:

  • set 变量 = 值:  这是很有用的,因为它可以让我们改变当前程序变量的值,按照我们想预期的值来执行后面的程序,而不需要重新运行程序。
  • 这里我们在for循环中运行第一次的时候,此时的i = 0,我们可以直接设置i = 6 那么下一次就会直接从6开始执行for循环了。
  • 当然要值得注意的是,如果报错,我们可以使用set variable 变量 = 值,因为直接使用命令这有可能会导致命令不清晰,GDB不知道是变量还是GBD内部的一些设置。

六 段错误追踪

我们有时候会遇到程序异常崩溃,然后会提示 Core Dump(段错误),这一般是程序调用了非法的内存地址,比如空指针,野指针等造成的,GDB也可以帮助我们找到这个地方。

6.1 设置核心文件大小:

  • ulimit -c: 如果后面不跟具体大小,则是显示当前核心文件的大小,如果加上数字表示当前核心文件当前系统最大可以生成核心文件的大小(单位:字节(B))
  • ulimit -c unlimited: 取消核心文件大小的限制

6.2 设置核心文件路径:

  • 我们最好是将核心文件生成的路径指定,这样方便查找。
  • %e表示程序名, %p表示进程id:这样生成的核心文件就会带上当前可执行文件的程序名和进程id了。

echo /home/data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern

6.3 追踪核心文件:

  • 这里我们首先把测试程序中指针初始化时给一个非法的地址,这样程序再读取这个地址的值时,就会异常崩溃,触发段错误。

  • 然后我们直接运行这个可执行文件,就会发送段错误

  • 此时我们查看之前设置的核心文件的生成路径/home/data/coredump就能看到生成的核心文件。

  • 接下来我们进入gdb环境: 切记要使用gdb 可执行文件名  不要直接使用GDB进入GDB环境。
  • 再进入之后我们使用core-file 核心文件名
  • 最后我们使用bt命令查看堆栈信息,就能准确看到崩溃的位置和信息了。
  • 我们可以看到确实是再main.c中的第18行导致的崩溃。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一屏万象,场景无限:蓝牙墨水屏标签多功能多场景应用带您领略未来

在数字化浪潮汹涌澎湃的今天&#xff0c;智能科技产品层出不穷&#xff0c;它们不仅极大地改变了我们的生活方式&#xff0c;更在无形中拓宽了我们的视野。而今&#xff0c;一款融合了创新技术与实用性于一体的蓝牙墨水屏标签&#xff0c;正以其多功能多场景应用的特性&#xf…

【wiki知识库】02.wiki知识库SpringBoot后端的准备

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f4c2;打开SpringBoot项目 2.1 导入所需依赖 2.2修改application.yml配置文件 2.3导入MybatisPlus逆向工程工具 2.4创建一个公用的返回值 2.5创建CopyUtil工具类 2.6创建…

固定Linux的ip地址,通过图形化界面操作,简单易上手

目录 1、查看Linux的网络 2、修改设置 3、修改Windows网络设置 1、查看Linux的网络 2、修改设置 3、修改Windows网络设置 Microsoft Windows [版本 10.0.19045.3996] (c) Microsoft Corporation。保留所有权利。C:\Users\dgq>ipconfigWindows IP 配置无线局域网适配器 WLAN:…

DataGrip软件执行已将创建好的sql文件步骤

一、在需要导入sql文件上右击找到SQLScript &#xff0c;然后点击 Run SQL Script 二、找到sql文件&#xff0c;点击OK就可以了

【编译原理复习笔记】正则表达式与自动机

正则表达式 正则表达式是一种用来描述正则语言的更紧凑的表达方法 e.g. r a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ) ra(a|b)^*(\epsilon|(.|\\_ )(a|b)) ra(a∣b)∗(ϵ∣(.∣)​(a∣b)) 正则表达式可以由较小的正则表达式按照特定的规则递归地构建。每个正则表达式定义…

【软件设计师】程序语言

1.程序设计语言基本概念 1.1 低级语言与高级语言 低级语言&#xff1a;机器语言和汇编语言称为低级语言 机器语言指0.&#xff0c;1组成的机器指令序列 汇编语言指用符号表示指令的语言&#xff0c;如MOV AX&#xff0c;2 高级语言&#xff1a;从人类的逻辑角度出发&#xff0…

蓝卓入选工信部2023年度“揭榜挂帅”项目

蓝卓“面向多元异构和应用快速开发演化的智能工厂操作系统解决方案”&#xff0c;凭借行业领先的平台技术能力以及数智赋能的硬核实力成功揭榜挂帅。 本次入选不仅代表了蓝卓又一次获得工信部权威专家及国家认可&#xff0c;更是“工厂操作系统”首次在国家层面获得表彰。 智能…

听说京东618裁员?所以日常准备很重要呀

文末有最少必要的面试题&#xff0c;还准备了离线 PDF 版本。 京东也要向市场输送人才了? 这几天看到技术群里不少朋友在讨论京东裁员相关的信息。 我去看了下京东近期的操作&#xff0c;京东内部考勤调整和午休时间缩短&#xff0c;以及强化打卡机制等管理调整&#xff1b;有…

IDEA设置运行内存

1.开启内存指示条​​​​​​​ 查看idea右下角​​​​​​​ 2.环境变量查看ideaVM地址&#xff0c;没有的话那就是默认的配置文件&#xff1a; idea 安装 bin 目录下 idea64.exe.vmoptions 3.去对应路径修改内存参数大小 4.重启IDEA&#xff0c;end

开启Three之旅(二)射线、拾取模型、解决鼠标点击、Hover以及CSS3Renderer点击穿透问题

文章目录 射线RayRaycaster屏幕坐标 --> 设备坐标射线坐标计算&#xff08;Canvas尺寸变化&#xff09;射线拾取层级模型拾取Sprite控制场景场景一&#xff1a;用鼠标模拟hover事件场景二&#xff1a; 选中模型&#xff08;click事件&#xff09;场景三&#xff1a;处理射线…

德勤:中国、印度等对ChatGPT等生成式AI应用,处领先地位

全球四大会计事务所之一的德勤&#xff08;Deloitte&#xff09;在官网发布了一份&#xff0c;名为《Generative AI in Asia Pacific: Young employees lead as employers play catch-up》的深度调查报告。 主要查看中国、澳大利亚、印度、日本、新加坡、韩国、中国台湾等亚太…

2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟

注意开浮点数 ​​​​ import java.util.Scanner;public class Main {static Scanner scnew Scanner(System.in);public static void main(String[] args) {double t0;int cnt0;double distance1000;while(distance>1){//相撞时间tdistance/60.0;distance-t*20;cnt;}Syste…

【深度学习】xformers与pytorch的版本对应关系

https://github.com/facebookresearch/xformers/tree/v0.0.23 找tag&#xff1a; tag下面写了对应关系&#xff1a; 安装指令就是&#xff1a; pip install xformers0.0.23 --no-deps -i https://download.pytorch.org/whl/cu118

minaActivatorA12+物主锁完美解信号,可登iCloud,有消息通知,支持iOS17.5.1+

原创 IOS福利部落 IOS福利部落 2024-05-26 19:35 福建 Mina Activator A12是一款绕过物主锁界面的解锁工具&#xff0c;可以激活所有iPhone恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持i…

如何保证员工在精益变革中始终保持积极的态度?

在当今日新月异的商业环境中&#xff0c;企业为了保持竞争力&#xff0c;需要不断寻求创新和变革。精益变革作为一种提升效率和质量的有效手段&#xff0c;已逐渐成为企业转型升级的关键。然而&#xff0c;变革往往伴随着挑战和不确定性&#xff0c;如何保证员工在精益变革中始…

高职高校实训教学实验室管理系统一体化

盛元广通高职高校实训教学实验室管理系统一体化是确保实验教学有序进行的关键环节。通过更加科学 、有效、合理的管理&#xff0c;明确排课原则、收集课程信息、评估实验室资源、制定排课计划、冲突检测与调整、发布排课信息、调课管理以及数据统计与分析等措施。实现了实验室资…

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车&#xff0c;如何编写串口通信指令 第14章-手机遥控功能 我们要实现蓝牙遥控功能&#xff0c;蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块 所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调 14.1-电脑控制小车 完成功能…

目标检测——无人机图像数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

【Linux安全】Firewalld防火墙基础

目录 一、Firewalld概述 二、Firewalld和iptables的关系 三、Firewalld网络区域 1、firewalld防火墙预定义了9个区域: 2、firewalld 数据包处理原则 3、firewalld数据处理流程 4、firewalld检查数据包的源地址的规则 四、Firewalld防火墙的配置方法 1、firewalld 命令…

气膜建筑:室内滑雪场的理想选择—轻空间

近年来&#xff0c;室内滑雪场成为越来越多投资者关注的热门项目。随着滑雪运动的普及&#xff0c;滑雪场的生意也愈加红火。对于投资者来说&#xff0c;选择一种省钱又实惠的搭建方案至关重要&#xff0c;而气膜建筑无疑是一个理想的选择。以下将详细介绍气膜建筑在室内滑雪场…