gdb调试常用指令及案例讲解

news2024/10/5 23:28:37

文章目录

  • 前言
  • 一、常用指令
  • 二、案例说明
    • 1、测试源文件
    • 2、编译和调试
  • 三、其他指令
  • 四、案例说明


前言

  • GDB是一个由GNU开源组织发布的、UNIX/LINUX 操作系统下的、基于命令行的、功能强大的程序调试工具。

  • GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序(也支持 go 等其他语言)。

一、常用指令

-g:		使用该参数编译可以执行文件,得到调试表。
gdb ./a.out
list: 		list 1 列出源码。根据源码指定 行号设置断点。
b: 		b 2020 行位置设置断点。
run/r: 		运行程序
n/next: 	下一条指令(会越过函数)
s/step: 	下一条指令(会进入函数)
p/print: 	p i 查看变量的值。
continue:继续执行断点后续指令。
finish:结束当前函数调用。
quit:退出 gdb 当前调试。

二、案例说明

使用 gdb 之前,要求对文件进行编译时增加 -g 参数,加了这个参数过后生成的编译文件会大一些,这是因为增加了 gdb 调试内容。

1、测试源文件

#include <stdio.h>

void myprint(int i)
{
    if (i % 2 == 1) {
        printf("this run, i = %d\n", i); 
    }   
}

int main(void)
{
    int i = 0;  

    printf("hello world\n");

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}

2、编译和调试

①、编译

gcc test.c -o test -g

在这里插入图片描述
②、启动对 test 的调试

gdb test

在这里插入图片描述
list/l n 从第 n 行开始显示程序, 后续继续输入 list/l,就可以显示后面的代码
在这里插入图片描述
break/b n 在第 n 行设置断点,断点那一行不会执行
在这里插入图片描述
run/r 运行程序
在这里插入图片描述
接下来按 next/n/step/s 继续向下执行
next/n :下一个,调用函数就跑
step/s :单步,会进入调用的函数
要注意的是,如果是系统函数,按 s 就出不来了,这时用 until+行号直接执行到行号处
在这里插入图片描述
进到 printf 系统函数出不来的示例
在这里插入图片描述
使用 until 出来
在这里插入图片描述
print/p i 查看 i 变量的值
在这里插入图片描述
continue 直接运行到结束
在这里插入图片描述

三、其他指令

run:使用 run 查找段错误出现位置。
set args: 设置 main 函数命令行参数 (在 start、 run 之前)
run 字串 1 字串 2 ...: 设置 main 函数命令行参数
info b: 查看断点信息表
b 20 if i = 5: 设置条件断点。
ptype:查看变量类型。
bt:列出当前程序正存活着的栈帧。
frame: 根据栈帧编号,切换栈帧。
display:设置跟踪变量
undisplay:取消设置跟踪变量。 使用跟踪变量的编号

四、案例说明

1、将上述 main 函数做如下修改,制造段错误

int main(void)
{
    int i = 0;  

    char *p = "TEST";
    
    printf("hello world\n");

    p[0] = 'Q';

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}
gcc test.c -o test -g
gdb test
run

在这里插入图片描述
可以看到段错误的位置

2、将上述 main 函数做如下修改,传参测试

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

    printf("hello world\n");

    printf("argc = %d\n", argc);
    printf("argv[0] = %s, argv[1] = %s\n", argv[0], argv[1]);

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}

命令行执行下述命令

gcc test.c -o test -g
gdb test
run

在这里插入图片描述
在这里插入图片描述
3、将上述 main 恢复成最初版本,做断点测试

int main(void)
{
    int i = 0;  

    printf("hello world\n");

    for (i = 0; i < 10; i++) {
        myprint(i);
    }   
}

设置两个断点,一个是普通断点(打在第14行),一个是条件断点(当 i = 6 时打在第6行),再执行 run

b 14
b 6 if i = 6
run

在这里插入图片描述
backtrace 命令是列出当前堆栈中的所有帧。在下面的例子中,栈上只有一帧,编号为0,属于 main 函数。

backtrace (或者bt)

在这里插入图片描述
接着,我们执行了 next 命令。下面我们继续通过 backtrace 命令来查看栈帧信息。
在这里插入图片描述
从上面输出结果,我们能够看出,有两个栈帧,第1帧属于 main 函数,第0帧属于 myprint 函数。
每个栈帧都列出了该函数的参数列表。从上面我们可以看出,main 函数没有参数,而 myprint 函数有参数,并且显示了其参数的值。

有一点我们可能比较迷惑,在第一次执行backtrace的时候,main 函数所在的栈帧编号为0,而第二次执行的时候,main 函数的栈帧为1,而 myprint 函数的栈帧为0,这是因为与栈的向下增长规律一致,我们只需要记住编号最小帧号就是最近一次调用的函数。

4、查看断点信息表 info b
在这里插入图片描述
5、栈帧 frame
栈帧用来存储函数的变量值等信息,默认情况下,GDB 总是位于当前正在执行函数对应栈帧的上下文中。

在前面的例子中,由于当前正在 myprint函数中执行,GDB 位于第0帧的上下文中。可以通过 frame 命令来获取当前正在执行的上下文所在的帧。
在这里插入图片描述
下面,我们尝试使用 print 命令打印下当前栈帧的值,如下:
在这里插入图片描述
如果我们想看其他栈帧的内容呢?比如 main 函数中的变量,那需要先切换栈帧再查看,我们可以通过 frame [num] 来切换栈帧,如下:
在这里插入图片描述
6、通过 ptype 查看变量的类型
在这里插入图片描述
7、通过 display 设置跟踪变量
和 print 命令一样,display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。

也就是说,使用 1 次 print 命令只能查看 1 次某个变量或表达式的值,而同样使用 1 次 display 命令,每次程序暂停执行时都会自动打印出目标变量或表达式的值。因此,当我们想频繁查看某个变量或表达式的值从而观察它的变化情况时,使用 display 命令可以一劳永逸。在这里插入图片描述
undisplay:取消设置跟踪变量。 使用跟踪变量的编号
在这里插入图片描述


我的qq:2442391036,欢迎交流!

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

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

相关文章

【JavaEE】_2.文件与IO

目录 1.文件概述 1.1 文件的概念 1.2 文件的存储 1.3 文件的分类 1.4 目录结构 1.5 文件操作 1.5.1 文件系统操作 1.5.2 文件内容操作 2. Java文件系统操作 2.1 File类所处的包 2.2 构造方法 2.3 方法 2.3.1 与文件路径、文件名有关的方法 2.3.2 文件是否存在与普…

Java核心技术 卷1-总结-13

Java核心技术 卷1-总结-13 具体的集合散列集树集队列与双端队列优先级队列 映射基本映射操作 具体的集合 散列集 链表和数组可以有序的存储元素。但是&#xff0c;如果想要查看某个指定的元素&#xff0c;却又忘记了它的位置&#xff0c;就需要访问所有元素&#xff0c;直到找…

vue2数据响应式原理(5) 通过重写函数实现数组响应式监听

其实 我们之前对数组的一个监听 还并不是很完美 我们打开案例 打开 output.js 更改代码如下 import { observe } from "./dataResp" const output () > {var obj {data: {data: {map: {dom: {isgin: true}},arg: 13},name: "小猫猫"},bool: [1,2,3,4…

【经验与Bug】tensorflow草记

文章目录 1 常用小知识2 Learn1) 疑惑未解2) 为何要有"bias"&#xff1f; 3 问题处理1) jupyter的环境指定目录运行jupyter 2) Keras版本3) 为什么accuracy为100%&#xff0c;迭代时参数还在更新&#xff1f; 1 常用小知识 conda activate tf 在anaconda prompt使用&…

Android studio 播放音频文件 播放语速

一、使用 public class MainActivity extends AppCompatActivity {private Hsvolume mHsVolume null;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mHsVolume new Hsvolume(th…

【YOLO系列】YOLOv1论文笔记

论文链接&#xff1a;[1506.02640] You Only Look Once: Unified, Real-Time Object Detection (arxiv.org) YOLO将目标检测看作回归问题&#xff0c;使用单个神经网络直接从完整图像上预测边界框和类别概率。&#xff08;端到端&#xff1a;输入原始数据&#xff0c;输出的是最…

E5EAA HENF105240R1将用于工业生产过程的测量、控制和管理

​E5EAA HENF105240R1将用于工业生产过程的测量、控制和管理 工业控制计算机是工业自动化控制系统的核心设备 工业控制计算机是工业自动化设备和信息产业基础设备的核心。传统意义上&#xff0c;将用于工业生产过程的测量、控制和管理的计算机统称为工业控制计算机&#xff0c;…

SpringBoot整合WebSocket的两种方式及微服务网关Gateway配置

一、说明 项目中后台微服务需要向前端页面推送消息&#xff0c;因此不可避免的需要用到WebSocket技术。SpringBoot已经为WebSocket的集成提供了很多支持&#xff0c;只是WebSocket消息如何通过微服务网关Spring Cloud Gateway向外暴露接口&#xff0c;实际开发过程中遇到了很多…

【数据结构第四章】- 串的模式匹配算法(BF 算法和 KMP 算法/用 C 语言实现)

目录 一、前言 二、BF 算法 三、KMP 算法 3.2.1 - KMP 算法的原理 3.2.2 - KMP 算法的实现 3.2.3 - KMP 算法的优化 创作不易&#xff0c;可以点点赞&#xff0c;如果能关注一下博主就更好了~ 一、前言 子串的定位运算通常称为串的模式匹配或串匹配。此运算的应用非常广…

美国主机的带宽和网络速度究竟有多快?

在选择一个主机时&#xff0c;其带宽和网络速度是非常重要的考虑因素。而美国主机在带宽和网络速度方面有着明显的优势&#xff0c;成为了众多用户的首选。那么&#xff0c;美国主机的带宽和网络速度究竟有多快呢?本文将通过分析美国主机的网络基础设施和数据中心设施&#xf…

golang入门项目——打卡抽奖系统

功能介绍 用户加入群组之后&#xff0c;会在签到群组所设的签到地点进行签到和签退&#xff0c;并限制同一个设备只能签到一个用户&#xff0c;签到成功之后。会获取一定的限制在该群组使用的积分。该群组可以设置一些抽奖活动&#xff0c;用户可使用该群组内的积分来进行该群…

Python+mysql+php搭建另类免费代理池

文章目录 前言:思路&#xff1a;开干&#xff1a;php连接MySQL取ip和端口&#xff1a;效果图&#xff1a; 最后调用代理池&#xff1a;总结&#xff1a; 前言: 为什么说另类的&#xff0c;因为我完全是按照我自己的想法来的&#xff0c;比较鸡肋&#xff0c;但是能用&#xff…

短视频app开发:如何提高视频播放稳定性

简介 如今&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分&#xff0c;而短视频app的开发也日益成为了人们热议的话题。在短视频app开发的过程中&#xff0c;如何提高视频播放稳定性是一个非常重要的问题。本文将从短视频源码角度出发&#xff0c;分享提高短视频ap…

如何优化语音交友app开发的搜索和匹配算法

语音交友app开发的挑战 在当今社交媒体行业中&#xff0c;语音交友app开发已经成为一个热门的领域。越来越多的人开始使用语音交友app来寻找新的朋友&#xff0c;这也为开发者们带来了许多机会。然而&#xff0c;这个领域也面临着一些挑战。其中一个最大的挑战是如何优化搜索和…

掏空腰包,日子难过,机缘转岗软件测试,这100个日夜的心酸只有自己知道...

我今年27岁&#xff0c;原本从事着土木工程相关的工作&#xff0c;19年开始有了转行的想法... 大学刚毕业那年&#xff0c;我由于学的是土木工程专业&#xff0c;自然而然的从事了和土木工程相关的工作&#xff0c;房贷、车贷&#xff0c;在经济的高压下&#xff0c;当代社会许…

大数据题目测试(一)

目录 一、环境要求 二、提交结果要求 三、数据描述 四、功能要求 1.数据准备 2.使用 Spark&#xff0c;加载 HDFS 文件系统 meituan_waimai_meishi.csv 文件&#xff0c;并分别使用 RDD和 Spark SQL 完成以下分析&#xff08;不用考虑数据去重&#xff09;。 (1)配置环境…

Java设计模式-day01

1&#xff0c;设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexand…

React Native iOS打包详细步骤

一、在自己项目的iOS文件夹下新建一个文件夹取名bundle 二、将打包命令写到项目package.json文件里&#xff0c;终端执行 npm run bundle-ios 先添加如下&#xff08;注意&#xff1a;这里写的路径"./ios/bundle"就是上面bundle创建的文件夹&#xff09;&#xff1a…

C51单片机介绍

本文为学习51单片机的学习的基础&#xff0c;先介绍单片机是什么。所使用的单片机有什么资源。每一个功能的作用是什么。本文使用的是STC89C52RC 40I-PDIO40&#xff0c;故以此为基础研究学习。 C51单片机介绍 单片机的概述单片机的组成部分中央处理器程序存储器数据存储器定时…

图神经网络能做什么?

从概念上讲&#xff0c;我们可以将图神经网络的基本学习任务分为 5 个不同的方向&#xff1a; &#xff08;1&#xff09;图神 经网络方法&#xff1b; &#xff08;2&#xff09;图神经网络的理论理解&#xff1b; &#xff08;3&#xff09;图神经网络的可扩展性&#xff1b…