Linux后台开发系列之「08.15 个 gdb 调试基础命令」

Linux中gdb程序调试器的命令使用(包括后台进程和多线程的调试) 一、什么是gdb?                gdb是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。        gdb中的命令固然很多,但我们只需要掌握其中最重要的十几个命令,就大致可以完成日常的基本的程序调试工作。 no symbol table is loaded 二、怎么进入gdb调试模式?                 不是什么可执行程序都是可以用gdb 阅读详情

代码键盘

版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处!

gdb 简介

gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上的集成开发环境 IDE 提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了 gdb 调试的常用命令,调试出程序会很有成就感,一方面因为这些命令就类似图形界面调试按钮背后的逻辑,另一方面用命令行来调试程序,逼格瞬间就上了一个档次,这次就跟大家分享 gdb 调试的基本技术和 15 个常用调试命令。

在此之前,我们先来回顾下在 Windows 上使用 IDE 的图形界面调试过程。

IDE 的调试步骤

在 Windows 的 IDE 下调试程序,例如使用 VS,一般都有下面这几个操作:

  1. Debug 模式编译并启动程序
  2. 程序运行出错,打断点分析出错的地方
  3. 单步运行程序,包括:step over 单步执行;step into 跳入函数;step return 跳出函数
  4. 还有全速运行,打印或者监视变量,冻结或解冻线程等调试技术

在 IDE 中上面的这些步骤一般都有固定的按钮提供给我们使用,非常的简单方便,我们只要多练习练习,在图形界面调试程序不会很难,但是在 Linux 下用命令来调试程序就比图形界面要复杂很多了。

其实,你知道真正的调试高手是什么样的吗?就是 Ta 对计算机原理和程序本身的逻辑理解非常深刻,在 Ta 的脑海中已经可以模拟程序的运行过程,并且知道可能出错的地方,这样连断点都不用打了,而且 Bug 的命中率也不低,或许这就是真正的大佬吧 :)

我们回到正题,来介绍在 Linux 使用命令行的调试过程。

gdb 的调试步骤

在 Linux 下既然是使用命令行来调试,顾名思义就是手敲命令来调试程序,大体分为下面几个步骤,后面会详细介绍:

  1. 编译可以调试的程序
  2. 运行程序,打断点
  3. 单步调试,监控变量
  4. 可视化调试
  5. 其他调试技术

可以看出,与 IDE 调试过程差不多,但是实际操作起来可是千差万别,可不是点按钮了,而是自己敲调试程序的命令,就相当于你正在学习那些调试按钮背后的原理,把这种方法学会,不用学就会使用 IDE 来调试程序,不管你信不信,我反正是信了 :)

下面开始正式的调试技术介绍。

15 个 gdb 调试基础命令

下面来正式介绍 gdb 常用的调试技术,都是调试命令,只看不做比较乏味,还是建议你跟我一起动手调试下面的程序,这样才能真正的学会,这是本次要调试的 hello.c 程序,非常简单:

#include <stdio.h>

int add(int x, int y) {
    return x + y;
}

int main() {
    int a = 1;
    int b = 2;
    printf("a = %d\n", a);
    printf("b = %d\n", b);

    int c = add(a, b);
    printf("%d + %d = %d\n", a, b, c);
    return 0;
}

1. 编译可以调试的程序

我们平常使用 gcc 编译的程序如果不加 [-g] 选项:

gcc hello.c -o hello

gdb 会提示该可执行文件没有调试符号,不能调试:

gdb hello
# gdb 提示信息
Reading symbols from a.out...(no debugging symbols found)...done.

如果需要让程序可以调试,就必须在编译的时候加上 [-g] 参数:

gcc -g hello.c -o hello

2. 载入要调试的程序

我们在命令行下需要手动载入待调试的程序,有 2 种方法:

方法一 - gdb 可执行文件

使用如下的命令来载入可执行文件 hello 到 gdb 中:

gdb hello

载入成功,gdb 会打印一段提示信息,并且命令行前缀变为 (gdb),下面是我的 Ubuntu 打印的信息:

GNU gdb (Ubuntu 7.11.90.20161005-0ubuntu1) 7.11.90.20161005-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from hello...done.
(gdb) q

注:按 q 退出 gdb

方法二 - 使用 gdb 提供的 file 命令

第二种方法是在 gdb 环境中使用 file 命令,我们需要先进入 gdb 环境下:

gdb

使用 file hello 载入待调试程序:

...
(gdb) file hello
Reading symbols from hello...done.
(gdb) q

3. 查看调试程序

在 gdb 下查看调试程序使用命令 list 或简写 l,「回车」列出后面程序:

(gdb) list
1   #include <stdio.h>
2   
3   int add(int x, int y) {
4       return x + y;
5   }
6   
7   
8   int main() {
9       int a = 1;
10      int b = 2;
(gdb) 
11      printf("a = %d\n", a);
12      printf("b = %d\n", b);
13      
14      int c = add(a, b);
15      printf("%d + %d = %d\n", a, b, c);
16      return 0;
17  }

4. 添加断点

在 gdb 下添加断点使用命令 break 或简写 b,有下面几个常见用法(这里统一用 b):

  1. b function_name
  2. b row_num
  3. b file_name:row_num
  4. b row_num if condition

比如我们以第一个为例,在 main 函数上添加断点:

(gdb) b main
Breakpoint 1 at 0x6e8: file hello.c, line 4.

打印的信息告诉我们在 hello.c 文件的第 4 行,地址 0x6e8 处添加了一个断点,那如何查看断点呢?

5. 查看断点

在 gdb 下查看断点使用命令 info break 或简写 i b,比如查看刚才打的断点:

(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000000006e8 in main at hello.c:4

可以看到打印出刚才添加的 main 函数的断点信息:编号,类型,显示状态,是否启用,地址,其他信息,那又如何删除这个断点呢?

6. 禁用断点

在 gdb 下禁用断点使用命令 disable Num,比如禁用刚才打的断点:

(gdb) disable 1
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep n   0x00000000000006e8 in main at hello.c:4

可以看到字段「Enb」已经变为 n,表示这个断点已经被禁用了。

7. 删除断点

在 gdb 下删除断点使用命令 delete 断点 Num 或简写 d Num,比如删除刚才的 Num = 1 的断点:

(gdb) d 1
(gdb) i b
No breakpoints or watchpoints.

删除后再次查看断点,提示当前没有断点,说明删除成功啦,下面来运行程序试试。

8. 运行程序

在 gdb 下使用命令 run 或简写 r 来运行当前载入的程序:

(gdb) r
Starting program: /home/orange/Desktop/gdb/hello 
a = 1
b = 2
1 + 2 = 3
[Inferior 1 (process 10415) exited normally]

我这次没有添加断点,程序全速运行,然后正常退出了。

9. 单步执行下一步

在 gdb 下使用命令 next 或简写 n 来单步执行下一步,假设我们在 main 打了断点:

(gdb) b main
Breakpoint 1 at 0x6e8: file hello.c, line 4.
(gdb) r
Starting program: /home/orange/Desktop/gdb/hello 

Breakpoint 1, main () at hello.c:4
4       int a = 1;
(gdb) n
5       printf("a = %d\n", a);

可以看到当前停在 int a = 1; 这一行,按 n 执行了下一句代码 printf("a = %d\n", a);

10. 跳入,跳出函数

在 gdb 下使用命令 step 或简写 s 来跳入一个函数,使用 finish 来跳出一个函数,我们在第 14 行 int c = add(a, b); 添加一个断点:

(gdb) b 14
Breakpoint 1 at 0x6f6: file hello.c, line 14.
(gdb) r
Starting program: /home/orange/Desktop/gdb/hello 
a = 1
b = 2

Breakpoint 1, main () at hello.c:14
14      int c = add(a, b);
(gdb) s
add (x=1, y=2) at hello.c:4
4       return x + y;
(gdb) finish
Run till exit from #0  add (x=1, y=2) at hello.c:4
0x0000555555554705 in main () at hello.c:14
14      int c = add(a, b);
Value returned is $1 = 3
(gdb) n
15      printf("%d + %d = %d\n", a, b, c);

这个过程是这样的:

  1. 在 14 行 int c = add(a, b); 添加断点
  2. 程序运行并停到 int c = add(a, b); 这一行
  3. s 跳入 add 函数
  4. finish 跳出 add 函数,并输出一些函数返回的信息

11. 打印变量

在 gdb 中使用命令 print var 或简写 p var 来打印一个变量或者函数的返回值,我们在第 10 行 int b = 2; 添加一个断点:

(gdb) b 10
Breakpoint 1 at 0x6c3: file hello.c, line 10.
(gdb) r
Starting program: /home/orange/Desktop/gdb/hello 

Breakpoint 1, main () at hello.c:10
10      int b = 2;
(gdb) p a
$1 = 1

我们打印出变量 a 的值为 1,在调试中比较频繁的操作是「监视变量」,在 gdb 中如何做呢?

12. 监控变量

在 gdb 中使用命令 watch var 来监控一个变量,使用 info watch 来查看监控的变量,我们这里来监控变量 c:

(gdb) b 14
Breakpoint 1 at 0x6f6: file hello.c, line 14.
(gdb) r
Starting program: /home/orange/Desktop/gdb/hello 
a = 1
b = 2

Breakpoint 1, main () at hello.c:14
14      int c = add(a, b);
(gdb) watch c
Hardware watchpoint 2: c
(gdb) info watch
Num     Type           Disp Enb Address            What
2       hw watchpoint  keep y                      c

注意:程序必须要先运行才能监控。

13. 查看变量类型

在 gdb 下使用命令 whatis 查看一个变量的类型:

(gdb) b 10
Breakpoint 1 at 0x6c3: file hello.c, line 10.
(gdb) r
Starting program: /home/orange/Desktop/gdb/hello 

Breakpoint 1, main () at hello.c:10
10      int b = 2;
(gdb) whatis b
type = int

这里变量 b 是 int 类型。

14. 在 gdb 中进入 shell

在 gdb 下使用命令 shell 启动 shell :

(gdb) shell
orange@ubuntu:~/Desktop/gdb$ exit
exit
(gdb) 

使用 exit 会再次退回到 gdb 中。

15. 在 gdb 中实现可视化调试

谁说 gdb 只能在命令行调试呢?gdb 也支持「图形界面」,不过这里的图形界面都是用字符显示的,当然不如 VS 那种好看,不过使用可视化相比直接看命令行更加直观了。

在 gdb 下使用 wi 启动可视化调试:

(gdb) wi

效果如下图所示,上面是代码效果,下面是命令界面:

gdb 图形界面

有了图形界面,就再对照着图形界面将前面的命令再练习练习,看看自己手敲的命令背后到底做了些什么,加深下影响。

结语

这篇博客主要介绍了 gdb 基本的调试技术,一篇文章不可能面面俱到,还有很多命令没有介绍,如果你有兴趣的话,这里还有一份比较好的 gdb 快速学习指南 送给爱学习的你,不用客气,叫我雷锋就好。

最后,感谢你的阅读,我们下次再见 :)

Linux 应用开发 - 15 个 gbd 调试基础命令 阅读详情

相关推荐

Linux | 调试器GDB的详细教程【纯命令行调试】

见识过纯命令行的调试器吗?那就来看看GDB吧,会让你眼前一亮

做技术人 · 产优质博客 · 找好工作 1万+

gdb后台调试

         程序出现段错误,短时间内不能重现,挂gdb的时间太长,客户端不能一直保持连接,我想让gdb跑在服务器后台可以避免这种情况,输出重定向比较容易,但是如何重定向输入呢,为了解决这个问题,google了半天,找输入重定向的方法,浪费了大量时间,才发现gdb本身就支持了这个功能,废话少说,进入正题。        gdb的--command=file选项,支持从文件输入命令,所以调试

rainharder的专栏 5377

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景,JDK与JDBC,Java Web技术,Spring Boot系列,以及MyBatis框架的基本实现,最后还将讨论Java在大数据、人工智能、嵌入式和Android等领域的应用。

wnm23的专栏 5220

linux—常用gdb调试命令汇总

如果是函数递归调用,当还没开始递归时,finish会执行完整个函数,自动走完全部递归过程(前提无断点)。因为在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本。*gdp会自动记录最近的命令,如果没有输入其他命令,可以按enter键继续执行最近命令。需要注意的是,不能直接写变量名,变量编号使用infodisplay即可知道。如果我们需要在调试中一直显示某个变量的值,那么就需要display命令了。需要注意的是,这种方法只能显示一次变量值,当继续调试时变量不再显示。...

weixin_61857742的博客 2万+

生成对抗网络——CGAN(代码+理解)

CGAN(Conditional Generative Adversarial Network)模型是一种 深度学习模型,属于生成对抗网络(GAN)的一种 变体。它的 基本思想是通过 训练生成器和判别器两个网络,使生成器能够生成与给定条件 相匹配的 合成数据,而判别器则 负责区分真实数据和 生成数据。相比于GAN它引入了条件信息(y),使得生成器可以生成与给定条件相匹配的合成数据,从而提高了生成数据的可控性和针对性。

CXDNW的博客 1万+

论文阅读笔记:Extended Vision Transformer (ExViT) for Land Use and Land Cover Classification

注意力机制驱动的深度模型最近取得了成功,如最具代表性的视觉转换器(ViT),吸引了一波高级研究来探索它们对更广泛领域的适应。然而,遥感(RS)领域中基于Transformer的方法更关注单模态数据,这可能会在充分利用不断增长的多模态地球观测数据时失去可扩展性。为此,我们提出了一种新的多模式深度学习框架,通过在最小修改的情况下扩展传统的ViT,针对土地利用和土地覆盖(LULC)分类任务。

嗑研狗的日常 945

linux下gdb调试方法与技巧整理

目录一、gdb简介二、gdb使用流程1、启动gdb2、查看源码3、运行程序4、设置断点5、单步执行6、查看变量7、退出gdb三、gdb基本使用命令1、运行命令2、设置断点3、查看源码4、打印表达式5、查看运行信息6、分割窗口7、cgdb强大工具四、总结 一、gdb简介 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下...

niyaozuozuihao的博客 17万+

4、基于球面波展开的近场/远场变换技术解析

本文深入解析了基于球面波展开的近场/远场变换技术,涵盖坐标系统选择、截断测量处理、高级SWE方法及实际应用场景。重点介绍了广义SWE、全探头补偿、平移SNF测量(TSWE)等关键技术,结合吸收材料与导电地板系统的误差处理方案,系统总结了各类方法的优缺点与适用场景,并通过流程图和案例分析展示了技术应用路径。该技术在汽车、通信和航空航天领域的天线测量中具有重要价值,可显著提升测量效率与精度。

dell8的博客 255

【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?)

GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于以后想称为一个Linux下工作的c/c++程序员,GDB是必不可少的工具,所以本篇来从零讲解GDB在LInux的调试。 对于GDB调试器来说,不像VS编译器中那样的图形化界面形式,而是采用纯命令行的形式进行调试。so 在开始学习的时候,大家可能会感觉晦涩难懂,但是这是C/C++程序员必须要掌握的技能,所以我将手把手进行零基础的讲解,本篇以C语言来讲解和调试。

weixin_45031801的博客 13万+

基于STM32L4XX、HAL库的 TMC2660C-PA 驱动程序设计

/ 默认灵敏度和电流。// 20/31最大电流。

zhusl6688的博客 384

番外篇 | 关于YOLO11算法的改进点总结

关于YOLO11算法的改进点总结。🌈

小哥谈 2311

GDB调试

转载至从 0 开始学习 Linux 系列之「08.15 个 gdb 调试基础命令」 此处仅想保存下来自己记录 gdb 简介 gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上的集成开发环境 IDE 提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了 gdb 调试的常用命令,调试出程序会很有成就感,一方面因为这些命令就类似图形界面调试按钮背后的逻辑,另一方面用命令行来调试程序,逼格瞬

小白的成长 1万+

【转录调控网络】代谢组学与其他组学的联合分析经典模式简介

多组学联合分析经典模式转录组学&代谢组学联合分析 转录组学&代谢组学联合分析 转录组是获得生物体内基因表达的重要方法,代谢组是生物体表型的基础和直接体现者。 转录组测序可以得到大量差异表达基因和调控代谢通路,但由于基因与表型之间很难之间关联,导致关键的信号通路难以确定,因此往往达不到预期的研究目的。代谢产物是生物体在内外调控下基因转录的最终结果,是生物体表型的物质基础。 在系统生物学研究时代,生物过程复杂多变,基因调控网络复杂。针对特定的生理、病理等表型进行研究,利用转录组的数据获得大量差异

小哲的博客 6194

【Linux我做主】GDB调试工具完全指南

带你迅速上手GDB调试!!!

有梦想的电信狗 3345

n8n智能体开发:Microsoft Outlook 节点

使用 Microsoft Outlook 节点可以自动化 Microsoft Outlook 工作流程,并将其与其他应用程序集成。n8n 内置支持多种 Microsoft Outlook 功能,包括创建、更新、删除和获取文件夹、邮件及草稿等操作。

王国平的博客 570

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux指南】Linux调试利器gdb入门:从编译到基础命令实战

在Linux环境下开发C/C++程序时,遇到bug是家常便饭。无论是逻辑错误、内存泄漏还是运行时崩溃,一款强大的调试工具都能帮我们快速定位问题根源。gdb(GNU Debugger) 作为Linux系统中最常用的命令行调试工具,支持断点设置、变量查看、单步执行等核心功能,是开发者排查问题的"利器"。 本文将从最基础的"如何生成可调试程序"讲起,逐步介绍gdb的启动方式、核心调试命令及实战技巧,帮助新手快速掌握gdb的使用方法。

倔强的石头的博客 7099

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux下gdb调试用法

稍微小小介绍一下 gdb是GUN组织开发的Linux下的调试利器。一般用于调试C/C++程序。 GDB主要有以下4个功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。下 直接进入主题 这是本次用来测试的代码 #includ...

weixin_62017112的博客 9553

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

从 0 开始学习 Linux 系列之「08.15 个 gdb 调试基础命令」

gdb 简介 gdb 是 UNIX 及 UNIX-like 下的调试工具,在 Linux 下一般都直接在命令行中用 gdb 来调试程序,相比 Windows 上的集成开发环境 IDE 提供的图形界面调试,一开始使用 gdb 调试可能会让你感到生无可恋,但是只要熟悉了 gdb 调试的常用命令,调试出程序会很有成就感。 一方面因为这些命令就类似图形界面调试按钮背后的逻辑,另一方面用命令行来调试程序...

登龙的专栏 296

Linux基础环境开发工具的使用(三):gdb调试器

Linux基础环境开发工具的使用(三):gdb调试器

Wzs040810的博客 685

c语言基础系列15-调试技巧:GDB

当我们的程序出现问题且不知道具体的原因时,我们就需要对程序进行调试分析,这时GDB调试工具就会起到很大作用。GDB是GNU开源组织发布的一款强大的Unix下的程序调试工具,在Linux系统中应用非常广泛。它可以用于调试C,C++,Objective-C等语言编写的程序。

人工智能微客/aiweker 1922

【Linux】调试工具GDB的使用及案例讲解

GDB是Linux下一款强大的调试工具。GDB可以调试C、C++、Java等语言,对于在Linux下工作的程序员来说,GDB是必不可少的调试工具。本篇我将以c程序,进行调试和讲解当大家对指令比较熟悉时,gdb的使用还是比较简单的,以上是我个人,经常使用的命令,是对标VS下编译的调试功能来介绍的,如果这不能满足你的要求,可以搜一些更高级的用法。

2301_80774875的博客 1861

Linux笔记---调试工具GDB(gdb)

GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。

2302_80372340的博客 5478

【Linux】Linux调试器-gdb使用

在前面的博客【Linux】编译器-gcc/g++使用已经分享了关于编译器的使用,而编译器的使用离不开调试,这次就来分享一下Linux调试器-gdb使用。

zxctsclrjjjcph的博客 1996

linux gdb调试命令详解

1. list 命令 list命令可以所写为l,可以列出所调试程序的代码(前提是代码与可执行程序在同一服务器上),其居具体使用方法如下: list+lineNumber,打印指定行附近的代码。如list 45,gdb会将45行前后的代码打印在屏幕上。 直接输入list,gbd会将gdb当前所处的行以及后面的代码打印在屏幕上。 输入list -,gbd会将gdb当前所处的行前面的代码打印在屏幕上。 list+functionName,打印名称为functionName的函数的上下文的代码。 2

strut的博客 5009

【Linux调试器-gdb使用】

原来这就是gdb?一文教你快速上手gdb。

m0_68872612的博客 2665

Linux嵌入式 gdb VSCode图形化调试教程

文章目录介绍GDB简介交叉编译器的gdb 介绍 在学习单片机的时候我们可以通过集成式IDE 来进行调试,比如MDK、IAR 等。在嵌入 式linux 领域是否也可以进行调试呢?答案肯定是可以的,在嵌入式linux 领域我们最常用的就 是GDB 调试工具,通过GDB 来调试嵌入式C 程序。本章我们首先学习如何搭建嵌入式Linux 的GDB 调试环境,然后讲解如何使用GDB 工具调试C 程序。 GDB简介 gdb 工具是GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用gdb 来一 行行的运行程序

“逛丢一只鞋”的博客 6621
上一篇: Linux后台开发系列之「07.gcc 编译基础」
下一篇: Linux后台开发系列之「09.Makefile 基础语法」
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值