Linux开发工具(含gdb调试教程)

news2024/11/14 21:09:35

文章目录

  • Linux开发工具(含gdb调试教程)
    • 1、Linux 软件包管理器 yum
    • 2、Linux开发工具
      • 2.1、Linux编辑器 -- vim的使用
        • 2.1.1、vim的基本概念
        • 2.1.2、vim的基本操作
        • 2.1.3、vim正常模式命令集
        • 2.1.4、vim末行模式命令集
      • 2.2、vim简单配置
    • 3、Linux编译器 -- gcc/g++使用
      • 3.1、背景知识
      • 3.2、gcc如何完成
      • 3.3、函数库
    • 4、Linux项目自动化构建工具-make/Makefile
      • 4.1、make 和 Makfile
      • 4.2、make clean 和 .PHONY
    • 5、Linux第一个小程序-进度条
      • 5.1、\r(回车)和 \n(换行)区别
      • 5.2、行缓冲区概念
      • 5.3、进度条代码
      • 5.3.1、简单进度条代码(printf)
      • 5.3.2、模拟真实情况的进度条代码
    • 6、Linux调试器-gdb使用
      • 6.1、背景
      • 6.2、使用

img

Linux开发工具(含gdb调试教程)

1、Linux 软件包管理器 yum

  • 什么是软件包?

    Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器(阿里云、腾讯云、百度云等等)上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

    yum(Yellow dog Updater, Modified)Linux下非常常用的一种包管理器。主要应用在Fedora, RedHat, Centos等发行版上。

  • 查看yum的周边 — yum的整个生态的问题

    这里有三个问题:

    1、yum如何得知目标服务器的地址和下载链接?

    答:在yum下存在一个目录/etc/yum.repos.d/,这个目录里面有一个文件CentOS-Base.repo,这个文件里面有这目标服务器服务器的地址和下载链接。

    2、云服务谁提供的?

    答:因为这个Linux是国外团队研发出来的,所以Linux的资源都在国外。但是我们如果每次下载这个资源都需要访问国外的网络(俗称翻墙),那么速度会很慢,因此国内很多公司会把这个国外的资源镜像过来供国人使用,并且在国内访问速度更快,使用更加便捷。比较出名的是网易的163、清华大学、阿里云的镜像网站

    3、谁提供软件?

    答:Linux的软件主要来源于各种发行版。这些发行版可以是官方维护的,如Ubuntu背后的Canonical,他们有一个团队来维护核心的软件包,如Linux内核、桌面环境以及常用的各类软件等。同时,也有社区维护的发行版,比如Fedora上的RPM Fusion。社区维护那些官方软件源不包含的软件。这些软件可供于分享和交流、建立社区、创造价值、学习和教育。

  • 关于 rzsz

    这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件。安装完毕之后可以通过拖拽的方式将文件上传过去

  • 注意事项

    关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!可以通过 ping 指令验证

    ping www.baidu.com

    按下ctrl+C停止

  • 查看软件包

    通过 yum list 命令可以罗列出当前一共有哪些软件包。由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包。例如:
    yum list | grep lrzsz

    • 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构。
    • “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配。
    • “el7” 表示操作系统发行版的版本。 “el7” 表示的是 centos7/redhat7。 “el6” 表示 centos6/redhat6。
    • 最后一列, os 表示的是 “操作系统” 的名称。
  • 如何安装软件

    • 普通用户sudo yum install 软件名称
    • root用户yum install 软件名称

    yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装。出现 “complete” 字样, 说明安装完成。

    yum安装软件只能一个装完了再装另一个。正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错。

  • 如何删除软件

    • 普通用户sudo yum remove 软件名称
    • root用户yum remove 软件名称

    注意这里是remove,不是uninstall


2、Linux开发工具

2.1、Linux编辑器 – vim的使用

2.1.1、vim的基本概念
  • vim有多种模式,目前我们仅需要掌握三种,分别是命令模式(command mode)插入模式(Insert mode)底行模式(last line mode),各模式的功能区分如下:

    • 正常/普通/命令模式(Normal mode)

      控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

    • 插入模式(Insert mode)

      只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式

    • 末行模式(last line mode)

      文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+:即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes

2.1.2、vim的基本操作
  • 进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面。

    vim test.c

    这里我们注意到进入到vim的时候是[NORMAL模式](正常模式/命令模式)。如需要输入信息,需要切换到[插入模式](INSERT模式)。

  • [正常模式] 切换至 [插入模式],先按下键盘左上角esc(以防万一,无脑esc就行了)。下面随便按下键盘的三个字母的其中一个:

    输入a

    输入i

    输入o

  • [插入模式] 切换至 [正常模式]

    目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。

  • [正常模式] 切换至 [末行模式]

    输入「shift + ;」, 其实就是输入「:」

  • 退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:

    :w — 保存当前文件

    :wq — 保存当前文件并退出vim

    :wq! — 保存当前文件并强制退出vim

    :q! — 不存盘强制退出vim

2.1.3、vim正常模式命令集
  • 移动光标

    • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」(巧记:四个字母的最左边)、「j」(巧记:jump,往下跳)、「k」(巧记:king,王,高高在上)、「l」(巧记:四个字母的最右边),分别控制光标左、下、上、右移一格
    • 按「G」 (shift+g):移动到文章的最后
    • 按「 $ 」 (shift+4):移动到光标所在行的“行尾”
    • 按「^」 (shift+6):移动到光标所在行的“行首”
    • 按「w」:光标跳到下个字的开头
    • 按「e」:光标跳到下个字的字尾
    • 按「b」:光标回到上个字的开头
    • 按「#l」:光标移到该行的第#个位置,如:5l,56l
    • 按[gg]:进入到文本开始
    • 按「ctrl」+「b」:屏幕往“后”移动一页
    • 按「ctrl」+「f」:屏幕往“前”移动一页
    • 按「ctrl」+「u」:屏幕往“后”移动半页
    • 按「ctrl」+「d」:屏幕往“前”移动半页
  • 删除文字

    • 「x」:每按一次,删除光标所在位置的一个字符
    • 「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
    • 「X」 (shift+x):大写的X,每按一次,删除光标所在位置的“前面”一个字符
    • 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
    • 「dd」:删除光标所在行(带剪切功能),可以配合p使用
    • 「#dd」:从光标所在行开始删除#行
  • 复制粘贴

    • 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。

    • 「#yw」:复制#个字到缓冲区

    • 「yy」:复制光标所在行到缓冲区。

    • 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

    • 「p」:将缓冲区内的字符贴到光标所在位置。

      注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能

  • 替换

    • 「r」:替换光标所在处的字符。

    • 「R」(shift+r):替换光标所到之处的字符,直到按下「ESC」键为止。

  • 撤销上一次操作

    • 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复

    • 「ctrl + r」(注意不是shift+r): 撤销的恢复

  • 跳至指定的行

    • 「ctrl」+「g」列出光标所在行的行号。
    • 「#G」:例如,「12G」,表示移动光标至文章的第12行行首。
  • 在vim中,可以通过以下步骤选中多行进行注释

    1. 进入命令行模式,按ctrl + v进入 visual block模式。
    2. jk键选中需要注释的多行。
    3. 按大写字母I,然后插入注释符,例如//
    4. esc键就会全部注释了。

    取消多行注释也是类似的操作:

    1. 进入命令行模式,按ctrl + v进入 visual block模式。
    2. 按小写字母l横向选中列的个数,例如需要选中2列。
    3. jk键选中注释符号。
    4. d键就可全部取消注释。
  • 在vim中,选中多行进行缩进的快捷键有以下两种方法

    方法一:

    1. 进入命令行模式,按ctrl + v进入列编辑模式。
    2. shift + v选中需要缩进的行。
    3. 选中后,使用`=“进行缩进或者使用“<” “>”进行缩进。

    方法二:

    1. 进入命令行模式,按ctrl + v进入列编辑模式。
    2. shift + v选中需要缩进的行。
    3. 选中后,使用快捷键command(花键)+]进行右缩进,同理,使用快捷键command(花键)+[进行左缩进。

    以上就是在vim中选中多行进行缩进的两种方法。

2.1.4、vim末行模式命令集

在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式

  • 列出行号

    • 「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。

  • 跳到文件中的某一行

    • 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字12,再回车,就会跳到文章的第12行。

  • 查找字符

    • 「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。

    • 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

      问题:/ 和 ? 查找有和区别 ? 操作实验一下

      答:/从前往后查找,? 从后往前查找

  • 保存文件

    • 「w」: 在冒号输入字母「w」就可以将文件保存起来。
  • 退出vim

    • 「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim
    • 「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
  • 多窗口模式

    末行模式输入vs 文件,如vs code.c

    这时候如果你想切换光标到另一个文件,先esc,再ctrl+ww,这样光标就移动到另一个文件了

2.2、vim简单配置

  • 配置文件的位置

    • 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。

    • 而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root目录下,

    • 通常已经存在一个.vimrc文件,如果不存在,则创建之。

    • 切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~

    • 打开自己目录下的.vimrc文件,执行 vim .vimrc

  • 常用配置选项,用来测试

    • 设置语法高亮: syntax on
    • 显示行号: set nu
    • 设置缩进的空格数为4: set shiftwidth=4

    在vim .vimrc编辑后下列内容后保存退出(底行模式输入:wq)。


3、Linux编译器 – gcc/g++使用

3.1、背景知识

  • 代码运行流程

    1. 预处理(进行宏替换)

    2. 编译(生成汇编)

    3. 汇编(生成机器可识别代码)

    4. 链接(生成可执行文件或库文件)

3.2、gcc如何完成

格式:gcc [选项] 要编译的文件 [选项] [目标文件]

  • 预处理(进行宏替换)

    • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等

    • 预处理指令是以#号开头的代码行

    • 实例:gcc –E test.c –o test.i

    • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程

    • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

  • 编译(生成汇编)

    • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言

    • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

    • 实例: gcc –S test.i –o test.s

  • 汇编(生成机器可识别代码)

    • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件

    • 在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码

    • 实例:gcc –c test.s –o test.o

  • 链接(生成可执行文件或库文件)

    • 在成功编译之后,就进入了链接阶段,链接后形成可执行文件

    • 实例: gcc test.o –o test

  • 运行可执行文件

    • 实例:./test

3.3、函数库

  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
  • 其实是系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
  • Linux的函数库库分为静态库和动态库两种
  • 静态库(或称静态链接库)的名字通常以.a为后缀,它是一个外部函数与变量的集合体。在编译期间,编译器与连接器会将静态库集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。这个可执行文件中包含了库代码的一份完整拷贝。优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。缺点是被多次使用时会有多份冗余拷贝。

  • 动态库(或称动态链接库)的名字通常以.so为后缀,它在编译的时候并没有被编译进目标代码中。程序执行到相关函数时才会调用该函数库里的相应函数,因此动态库所产生的可执行文件比较小。由于函数库没有被整合进程序,而是程序运行时动态地申请并调用,所以程序的运行环境中必须提供相应的库。动态库的改变并不影响程序,所以动态库的升级/更新比较方便。

  • gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

  • 在Linux系统中,库文件通常存放在/usr/lib或/lib目录下。

  • 回到根目录/,输入cd lib64/,再ll,再此目录下可以看到文件。


  • gcc选项记忆

    • ESc:键盘左上角

    • iso:镜像文件


4、Linux项目自动化构建工具-make/Makefile

4.1、make 和 Makfile

make 是一个用于自动化项目构建的工具(命令),通常用于编译和链接源代码文件以生成可执行文件或库。Makefilemake 工具使用的配置文件,它定义了项目中文件之间的依赖关系和构建规则。通过 makeMakefile,可以确保只有在需要时才重新构建项目的组件,从而提高开发效率。

以下是关于 makeMakefile 的基本概念:

  1. make 命令make 命令由用户执行,它根据 Makefile 文件中定义的规则来构建项目。默认情况下,make 会在当前目录中查找名为 Makefilemakefile 的文件,但也可以通过使用 -f 选项指定其他 Makefile 文件的名称。

  2. Makefile 文件Makefile 文件是一个文本文件,它包含了一组规则和目标。每个规则定义了一个或多个目标文件,以及构建这些目标文件所需的依赖文件和构建命令。规则通常遵循以下格式:

    target: dependencies
        command
    
    • target:表示需要构建的目标文件
    • dependencies:表示构建目标文件所需要的依赖文件。
    • command:表示构建目标文件的命令。

    例如:

    my_program: main.c utils.c
        gcc -o my_program main.c utils.c
    

    在这个示例中,my_program 是目标文件,它依赖于 main.cutils.c,构建命令是使用 gcc 编译这些源文件以生成可执行文件。

  3. 依赖关系Makefile 中的依赖关系表示了目标文件和依赖文件之间的关系。如果依赖文件发生更改,或者目标文件不存在,make 将执行规则中的构建命令,以确保目标文件是最新的

    • 上面的文件 test ,它依赖 test.o
    • test.o , 它依赖 test.s
    • test.s , 它依赖 test.i
    • test.i , 它依赖 test.c

  4. 自动化构建make 工具的一个主要优势是它能够自动检测哪些文件需要重新构建,以减少不必要的编译和链接操作。它只会重新构建已更改或丢失的文件,而不是整个项目。

  5. 变量和函数Makefile 支持变量和函数,可以用于简化规则的定义和提高可维护性。可以在 Makefile 中定义变量,然后在规则中引用这些变量。例如:

    CC = gcc
    CFLAGS = -Wall -O2
    
    my_program: main.c utils.c
        $(CC) $(CFLAGS) -o my_program main.c utils.c
    

    在这个示例中,CCCFLAGS 是变量,它们用于存储编译器和编译选项,从而使 Makefile 更具灵活性。

makeMakefile 是在Unix/Linux开发中非常有用的工具,它们有助于自动化和简化项目的构建过程。通过定义清晰的规则和依赖关系,可以更有效地管理和维护项目的构建过程。

4.2、make clean 和 .PHONY

make clean.PHONY 是与 makeMakefile 相关的两个重要概念。

  1. make clean

    make clean 是一种常见的 make 命令,通常用于清理项目目录,删除生成的文件和临时文件。在 Makefile 中,可以定义一个名为 “clean” 的伪目标(phony target),并在其中列出需要删除的文件或目录。这样,当运行 make clean 时,make 将执行清理操作。

    以下是一个示例 Makefile 中的 clean 规则:

    clean:
        rm -f *.o my_program
    

    在这个示例中,clean 是一个伪目标,它没有实际的文件依赖,但当运行 make clean 时,将执行 rm -f *.o my_program 命令,以删除所有 .o 文件和可执行文件 my_program

  2. .PHONY

    .PHONY 是一个特殊的目标,用于告诉 make 哪些目标是伪目标(不表示实际的文件),以防止 make 误解这些目标。通常,伪目标在 Makefile 中不会表示实际的文件,而是用于执行特定的操作或任务(比如clean清理数据)

    通过使用 .PHONY,您可以明确告诉 make 哪些目标是伪目标。例如:

    .PHONY: clean
    
    clean:
        rm -f *.o my_program
    

    在这个示例中,.PHONY: clean 表示 “clean” 是一个伪目标。这有助于避免与同名的实际文件或目录发生冲突,并确保 make clean 始终执行 clean 规则。

    鉴于之前的make命令在编译了一次后,在没修改文件的基础上再make是不会执行的。如果想要再执行的时候可以执行,这里就可以用到这个.PHONY(把各文件设置为伪目标)。

    这样就可以多次执行make命令了。

伪对象的作用有两个

  1. 使目标对象无论如何都要重新生成

  2. 并不生成目标文件,而是为了执行一些指令

总之,make clean 是用于清理项目目录的常见 make 命令,而 .PHONY 用于标记伪目标,以确保 make 正确地处理这些目标。这两者一起使用可以帮助您更好地管理项目的构建和清理操作。


5、Linux第一个小程序-进度条

5.1、\r(回车)和 \n(换行)区别

  • 回车:回车符(ASCII码为13,表示为\r将光标移到当前行的开头,允许您在同一行上覆盖已经存在的文本。在Unix和Linux系统中,回车通常不用于文本文件中的文本换行。

  • 换行:换行符(ASCII码为10,表示为\n将光标移动到下一行,用于分隔文本的不同行。在Unix和Linux系统中,文本文件的行通常以换行符来分隔。

5.2、行缓冲区概念

Linux的行缓冲是一种数据传输模式,它在读取和写入文本数据时按行进行操作。具体来说,数据将被分成一行一行,并在一行结束后才会被处理。这通常用于标准输入和标准输出,意味着用户在终端上输入的命令和程序的输出将在一行结束时才被处理。如果需要实时处理数据,可以选择禁用行缓冲,这样数据将更快地传输(也可以使用**fflush(stdout)**)。

禁用行缓冲:有时,您可能希望禁用行缓冲,以便实时地处理数据。您可以使用标准C库中的setbuf函数或setvbuf函数,或者使用Unix系统调用setvbuf来更改缓冲模式。例如,以下示例禁用了标准输出的缓冲:

setbuf(stdout, NULL); // 禁用标准输出的缓冲
  • 看下面代码
  #include <stdio.h>    
      
  int main(){    
      printf("hhaaaaaahhhhhhaahah\r");                                          
      //fflush(stdout);    
    	sleep(3);    
      printf("\n");    
      return 0;                 
  }
  • 执行结果

  • 改进后:
  #include <stdio.h>    
      
  int main(){    
      printf("hhaaaaaahhhhhhaahah\r");                                          
      fflush(stdout);    
    	sleep(3);    
      printf("\n");    
      return 0;                 
  }
  • 执行结果

5.3、进度条代码

5.3.1、简单进度条代码(printf)

  • main.c文件

    #include <stdio.h>    
    #include <unistd.h>    
    #include <string.h>    
    int main()    
    {    
      	int i = 0;    
      	char bar[101];    
      	memset(bar, 0 ,sizeof(bar));    
      	const char *lable="|/-\\";    
      	while(i <= 100 ){    
        	printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);    
        	fflush(stdout);    
        	bar[i++] = '#';    
        	usleep(100000);    
      	}
      	printf("\n");
      	return 0;                                                                                                              
    }
    
  • 运行结果

5.3.2、模拟真实情况的进度条代码

  • processbar.h 文件

    #include <stdio.h>                                                              
    #include <time.h>    
    #include <unistd.h>    
    #include <stdlib.h>    
        
    //函数指针    
    typedef void(*callback_t)(double);    
        
    //进度条    
    void process(double rt);
    
  • processbar.c 文件

    #include "processbar.h"    
        
    const char *lable="|/-\\";    
        
    void process(double rt){    
        static int num = 0;    
        static char bar[101] = {0};    
        printf("[\033[0;32m%-100s\033[0m]][%5.1f%%][%c]\r", bar, rt, lable[num%4]);     ++num;
        fflush(stdout);
        bar[(int)rt] = '#';
        if((int)rt == 100) printf("\n");
    }
    
  • main.c 文件

    void downlode(callback_t cb) {
        srand(time(NULL) ^ 1023);
        long total = FILESIZE;
        while (total) {
            usleep(100000);//下载动作
            long one = rand() % (1024 * 1024 * 5);
            total -= one;
            if (total < 0) total = 0;
    
            //当前进度
            double rate = ((FILESIZE - total) * 1.0) * 100 / FILESIZE;
    //        printf("%.1f\n", rate);
            cb(rate);
        }
    }
    
    int main() {
        downlode(process);
        return 0;
    } 
    
  • 运行结果


6、Linux调试器-gdb使用

6.1、背景

  • 程序的发布方式有两种,debug模式和release模式

  • Linux gcc/g++出来的二进制程序,默认是release模式

  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

6.2、使用

  • 退出ctrl + dquit

  • 调试命令

    • r:运行起来

    • list/l 行号:显示指定行之后的代码(gdb自动记录最近一条指令)

    • b 行号/函数名/file:行号:堆指定位置打断点

    • info b:查看我们所打的断点

    • d 断点编号:删除断点

    • disable/enable 断点编号:使能(禁用/开启)断点,注意这里编号是info b时候显示的编号

    • n:逐语句 – F10

    • s:逐过程 – F11

    • p:显示变量的内容和地址

    • display 变量名/取地址:常显示变量的内容或者地址

    • undisplay 编号:取消常显示变量的内容或者地址,注意这里是编号,这个编号是在display里面显示的编号

    • c:从一个断点运行到下一个断点(可用于问题范围查找)

    • finish:将一个函数运行结束,就停下来(可用于问题范围查找)

    • until:在一个范围内,直接运行到指定行(可用于问题范围查找),不能跳过函数调用,一般用于跳过循环

    • bt:查看调用堆栈

    • set var name=value:修改一个变量的内容(不用改代码,可用于多分支测试)

  • Makefile文件内容

    test_gdb:test_gdb.c                                                             
        gcc -o $@ $^ -g    
        
    .PHONY:clean    
    clean:    
        rm -f test_gdb
    
  • test_gdb.c文件内容

    #include <stdio.h>    
        
    int Sum(int n){    
        int i = 1;    
        int sum = 0;    
        for(; i<=n; ++i){    
            sum += i;    
        }    
        return sum;                                                                 
    }    
        
    int main(){    
        
        int result = Sum(100);    
        printf("result = %d\n",result);    
        
        return 0;    
    }
    
  • 测试调试功能




那么好,Linux开发工具就到这里,如果你对Linux和C++也感兴趣的话,可以看看我的主页哦。下面是我的github主页,里面记录了我的学习代码和leetcode的一些题的题解,有兴趣的可以看看。

Xpccccc的github主页

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

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

相关文章

数仓成本下降近一半,StarRocks 存算分离助力云览科技业务出海

成都云览科技有限公司倾力打造了凤凰浏览器&#xff0c;专注于为海外用户提供服务&#xff0c;公司致力于构建一个全球性的数字内容连接入口&#xff0c;为用户带来更为优质、高效、个性化的浏览体验。 作为数据驱动的高科技公司&#xff0c;从数据中挖掘价值一直是公司核心任务…

佳易王羽毛球馆计时计费软件灯控系统安装教程

佳易王羽毛球馆计时计费软件灯控系统安装教程 佳易王羽毛球馆计时计费软件&#xff0c;点击开始计时的时候&#xff0c;自动打开灯&#xff0c;结账后自动关闭灯。 因为场馆每一场地的灯功率都很大&#xff0c;需要加装交流接触器。这个由专业电工施工。 1、计时计费功能 &…

玻色量子“揭秘”之多项式回归问题与QUBO建模

摘要&#xff1a;多项式回归&#xff08;Polynomial Regression&#xff09;是一种回归分析方法&#xff0c;通过拟合一个多项式方程来模拟自变量与因变量之间的非线性关系。多项式回归的目标是找到一组多项式系数&#xff0c;使得拟合曲线尽可能地接近数据点。这种方法可以用于…

Arm64版本的centos编译muduo库遇到的问题的归纳

环境&#xff1a;Mac m2 pro下的VMware虚拟机中Arm64 centos ./build.sh 执行后提示如下 cmake -DCMAKE_BUILD_TYPErelease -DCMAKE_INSTALL_PREFIX…/release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDSON /root/package/muduo-master – Boost version: 1.69.0 – Co…

12.docker的网络-host模式

1.docker的host网络模式简介 host模式下&#xff0c;容器将不会虚拟出自己的网卡、配置IP等&#xff0c;而是使用宿主机的IP和端口&#xff1b;也就说&#xff0c;宿主机的就是我的。 2. 以host网络模式创建容器 2.1 创建容器 我们仍然以tomcat这个镜像来说明一下。我们以h…

Java之《ATM自动取款机》(面向对象)

《JAVA编程基础》项目说明 一、项目名称&#xff1a; 基于JAVA控制台版本银行自动取款机 项目要求&#xff1a; 实现银行自动取款机的以下基本操作功能&#xff1a;读卡、取款、查询。&#xff08;自动取款机中转账、修改密码不作要求&#xff09; 具体要求&#xff1a; 读卡…

CSS实现三角形

CSS实现三角形 前言第一种:bordertransparent第二种borderrgb使用unicode字符 前言 本文讲解三种实现三角形的方式&#xff0c;并且配有图文以及代码解说。那么好&#xff0c;本文正式开始。 第一种:bordertransparent border是边框&#xff0c;而transparent是透明的颜色&a…

计数排序+桶排序+基数排序 详讲(思路+图解+代码详解)

文章目录 计数排序桶排序基数排序一、计数排序概念&#xff1a;写法一&#xff1a;写法二&#xff1a; 二、桶排序概念代码 三、基数排序概念1.LSD排序法&#xff08;最低位优先法&#xff09;2.MSD排序法&#xff08;最高位优先法&#xff09; 基数排序VS基数排序VS桶排序 计数…

C++语法知识点-vector+子数组

C语法知识点-vector子数组 一维数组定义无参数有参数迭代器扩容操作reserve 二维数组 vector 定义创建m*n的二维vectorvector< vector<int> > v(m, vector<int>(n) ) 初始化定义vector常用函数的实例分析访问操作resize 函数push _back ( )pop_back()函数siz…

宣传技能培训1——《新闻摄影技巧》光影魔法:理解不同光线、角度、构图的摄影效果,以及相机实战操作 + 新闻摄影实例讲解

新闻摄影技巧 写在最前面摘要 构图与拍摄角度景别人物表情与叙事远景与特写 构图与拍摄角度案例 主体、陪体、前景、背景强调主体利用前景和背景层次感的创造 探索新闻摄影中的构图技巧基本构图技巧构图技巧的应用实例实例分析1. 黄金分割和九宫格2. 三角型构图3. 引导线构图4.…

2 使用React构造前端应用

文章目录 简单了解React和Node搭建开发环境React框架JavaScript客户端ChallengeComponent组件的主要结构渲染与应用程序集成 第一次运行前端调试将CORS配置添加到Spring Boot应用使用应用程序部署React应用程序小结 前端代码可从这里下载&#xff1a; 前端示例 后端使用这里介…

unity shaderGraph实例-可交互瀑布

不要问我水在哪里&#xff0c;你自己相像这是一个瀑布&#xff0c;瀑布的效果我还不会做 效果展示 整体结构 这里片元着色器最后输出的baseColor应该是黑色&#xff0c;白色为错误。 各区域内容 区域1 计算球到瀑布的距离&#xff0c;然后减去一个值&#xff0c;实现黑色区域…

【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!

想学习python进行数据分析&#xff0c;这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来&#xff0c;Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…

【亚太杯前两问论文】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)

2023年第十三届APMCM亚太地区大学生数学建模竞赛——论文无偿分享&#xff01;&#xff01;&#xff01; C题前两问论文代码已出&#xff0c;其他赛题及后续论文代码会持续更新。 祝各位小伙伴都能在比赛中发挥出色&#xff0c;取得心仪的成绩呦&#xff01;一起加油&#xff…

使用Arrays.Sort并定制Comparator排序解决合并区间

合并区间-力扣算法题56题 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&am…

姿态传感器——MPU6050

1、MPU6050介绍 MPU6050是由三个陀螺仪和三个加速度传感器组成的6轴运动处理组件&#xff0c;是一款六轴&#xff08;三轴加速度三轴角速度&#xff08;陀螺仪&#xff09;&#xff09;传感器。 内部主要结构 陀螺仪、加速度计、数字运动处理器DMP&#xff08;Digital Moti…

uniapp 轮播图(含组件封装,自动注册全局组件)

效果预览 组件封装 src\components\SUI_Swiper.vue 可参考官网配置更多属性 swipernavigator <script setup lang"ts"> import { ref } from vue defineProps({config: Object, })const activeIndex ref(0) const change: UniHelper.SwiperOnChange (e) &…

msvcp120.dll丢失是什么意思,哪个修复方法最简单

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcp120.dll”。这个错误通常发生在运行某些程序或游戏时&#xff0c;它会导致程序无法正常启动或运行。那么&#xff0c;这个错误提示到底是什么意思呢&#xff1f;为了解决这个问…

当老师应该选文科还是理科

教育不断发展和改革&#xff0c;教师职业的选择也越来越受到关注。许多人在选择专业时都会考虑成为一名教师&#xff0c;但对于选择文科还是理科却感到困惑。本文将探讨当老师应该选文科还是理科。 文科注重的是人文素养和社会科学方面的知识&#xff0c;而理科则注重自然科学和…

springcloud超市管理系统源码

技术说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看用户&#xff0c;商品&#xff0c;销售数量&#xff1b;…