GDB 使用与示例

逆向实战:手把手教你用Frida绕过Flutter App的SSL Pinning(附脚本修改指南) 本文详细介绍了如何利用Frida工具绕过Flutter应用的SSL Pinning保护机制,包括静态分析定位关键函数、定制Frida Hook脚本以及流量捕获的完整解决方案。通过实战案例和脚本修改指南,帮助安全研究人员有效应对Flutter应用的安全挑战,特别适用于安卓平台的逆向工程和抓包需求。 阅读详情
GDB概述

————

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。

一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。

 

GDB的命令使用简述

————


一 列文件清单

    * List

      (gdb) list line1,line2

二:执行程序
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和外壳通配符(*、?、[、])在内。如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。

(gdb)set args –b –x
(gdb) show args
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。

三:显示数据

    * 利用print 命令可以检查各个变量的值。

      (gdb) print p (p为变量名)

      print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:

   1. 对程序中函数的调用

      (gdb) print find_entry(1,0)

   2. 数据结构和其他复杂对象

      (gdb) print *table_start
      $8={e=reference=’/000’,location=0x0,next=0x0}

   3. 值的历史成分

      (gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值)

   4. 人为数组
      人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示:
      base@length
      因此,要想显示在h后面的10个元素,可以使用h@10

      (gdb)print h@10
      $13=(-1,345,23,-234,0,0,0,98,345,10)

    * whatis 命令可以显示某个变量的类型

      (gdb) whatis p
      type = int *

四:断点(breakpoint)
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:

    * break line-number 使程序恰好在执行给定行之前停止。
    * break function-name 使程序恰好在进入指定的函数之前停止。
    * break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
    * break routine-name 在指定例程的入口处设置断点

如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:

(gdb) break filename:line-number
(gdb) break filename:function-name

要想设置一个条件断点,可以利用break if命令,如下所示:

(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100

从断点继续运行:countinue 命令

五.断点的管理

1.显示当前gdb的断点信息:

(gdb) info break

他会以如下的形式显示所有的断点信息:

Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168

   1. 删除指定的某个断点:

      (gdb) delete breakpoint 1

      该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点

      (gdb) delete breakpoint

   2. 禁止使用某个断点

      (gdb) disable breakpoint 1

      该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n
   3. 允许使用某个断点

      (gdb) enable breakpoint 1

      该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y
   4. 清除原文件中某一代码行上的所有断点

      (gdb)clean number

      注:number 为原文件的某个代码行的行号

六.变量的检查和赋值

    * whatis:识别数组或变量的类型
    * ptype:比whatis的功能更强,他可以提供一个结构的定义
    * set variable:将值赋予变量
    * print 除了显示一个变量的值外,还可以用来赋值

七. 单步执行

    * next 不进入的单步执行
    * step 进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish

八.函数的调用

    * call name 调用和执行一个函数

      (gdb) call gen_and_sork( 1234,1,0 )
      (gdb) call printf(“abcd”)
      $1=4

    * finish 结束执行当前函数,显示其返回值(如果有的话)

九.机器语言工具
有一组专用的gdb变量可以用来检查和修改计算机的通用寄存器,gdb提供了目前每一台计算机中实际使用的4个寄存器的标准名字:

    * $pc : 程序计数器
    * $fp : 帧指针(当前堆栈帧)
    * $sp : 栈指针
    * $ps : 处理器状态

十.信号
gdb 通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。

Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:

    * nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
    * stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)
    * print 接受到信号时显示一条消息
    * noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)
    * pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
    * nopass 停止程序运行,但不要将信号发送给程序。

例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:

(gdb) handle SIGPIPE stop print

请注意,UNIX的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的 SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:

(gdb) signal 2
continuing with signal SIGINT(2)

该程序继续执行,但是立即传输该信号,而且处理程序开始运行.

 

一个调试示例
——————

源程序:tst.c

1 #include
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i
7 {
8 sum+=i;
9 }
10 return sum;
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
21 }
22
23 printf("result[1-100] = %d /n", result );
24 printf("result[1-250] = %d /n", func(250) );
25 }

编译生成执行文件:(Linux下)
hchen/test> cc -g tst.c -o tst

使用GDB调试:

hchen/test> gdb tst <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
1 #include
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i
7 {
8 sum+=i;
9 }
10 return sum;
(gdb) <-------------------- 直接回车表示,重复上一次命令
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
(gdb) break 16 <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break <-------------------- 查看断点信息。
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
(gdb) r <--------------------- 运行程序,run命令简写
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17 <---------- 在断点处停住。
17 long result = 0;
(gdb) n <--------------------- 单条语句执行,next命令简写。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <--------------------- 继续运行程序,continue命令简写。
Continuing.
result[1-100] = 5050 <----------程序输出。

Breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8 sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <--------------------- 查看函数堆栈。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <--------------------- 退出函数。
Run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf("result[1-250] = %d /n", func(250) );
Value returned is $6 = 31375
(gdb) c <--------------------- 继续运行。
Continuing.
result[1-250] = 31375 <----------程序输出。

Program exited with code 027. <--------程序退出,调试结束。
(gdb) q <--------------------- 退出gdb。

Kafka 消费积压排查:Lag 飙升与分区倾斜决策树 消息队列积压告警经常被当成「加机器」。单个分区被热点 key 打满、消费者线程卡在下游、或误把 Offset 重置到 earliest。乱会让下游重放几天数据。本文面向中级中间件 / 应用运维,覆盖开源 Kafka 与托管 MSK 都能用的只读命令。不讲如何从零搭集群,也不重复 ISR/副本不足类故障。先--dry-run,再停消费者,最后--execute# 须先停掉所有该 group 的消费者Lag 先看是否在线、是否倾斜、是否生产突刺。加分区救不了已经堆在热点分区上的数据。 阅读详情

相关推荐

高通MBIM拨号流程简述

高通平台MBIM流程简述

不秃头的程序猿Gabriel的博客 5048

大数据毕业设计过选题(详细)

大数据专业毕设选题指南】针对计算机大数据专业大四学生,提供选题参考与建议。选题应聚焦大数据技术应用,兼顾创新性与可行性,推荐方向包括:1)数据处理与分析(如MapReduce气候分析、Spark实时过滤系统);2)机器学习应用(神经网络文本分类、K-means微博挖掘);3)行业场景结合(电商用户行为分析、医疗肿瘤模式研究)。建议选择与个人技术匹配、能体现研究价值的课题,同时注重与导师沟通并制定详细实施计划。附100+选题示例,涵盖数据处理、深度学习、推荐系统等热门领域。

2501_93059099的博客 1765

基于Matlab的海杂波建模、滤波与目标检测程序实现

本程序设计为适用于MATLAB 2014a、2019b及2024b等个版本,确保在不同软件环境下均能顺利运行。程序包中已包含可直接执行的示例数据集,用户无需自行准备或预处理数据即可进行实验验证。代码采用高度参数化的架构,核心参数均设计为可灵活调整的变量,便于用户根据具体研究需求进行定制化修改。程序逻辑结构清晰,各模块功能明确,并配有详尽的中文注释,有助于用户深入理解算法实现过程与原理。该程序主要面向计算机科学、电子信息工程、数学等相关专业的高年级本科生及研究生,适用于课程项目、综合实验报告以及学位论文等学术场景。其核心内容聚焦于雷达信号处理中的关键技术环节:海面杂波的仿真建模、噪声抑制滤波以及目标信号的识别检测。在海杂波仿真部分,程序整合了种经典统计模型(如对数正态分布、双参数分布等),能够依据海洋环境参数(如风速、浪高、波浪方向等)生成符合实际物理特性的海面回波模拟数据。滤波模块则提供了包括卡尔曼滤波、自适应滤波及维纳滤波在内的种算法,用于抑制杂波中的随机噪声成分,从而增强有效信号的显著性。目标检测环节实现了恒虚警率检测、普勒特征分析等先进算法,旨在从处理后的信号中准确识别出潜在目标的存在及其运动特征。整套工具集兼具学术严谨性与工程实用性,不仅为相关领域的理论教学与科研探索提供了完整的仿真平台,也为雷达系统性能评估与算法优化提供了可靠的技术支持。通过使用本程序,使用者可系统掌握海杂波特性分析与目标检测的基本方法,进而提升在复杂电磁环境下信号处理的实践能力。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

新手程序员看,做到这六点才能少走弯路

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…网上虽然也有很的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

Javachichi的博客 677

2024大数据技术Python学习心得

Python的简洁与强大让我印象深刻,特别是在数据处理和可视化方面表现突出。通过实际项目应用,我不仅提升了编程技能,还培养了逻辑思维和解决问题,未来我将继续深化Python知识,应用于更领域,提升自我实力。‌‎

lms11511的博客 875

如何正确学习大数据,才能少走弯路

在技术论坛中或知乎上,看到近几万的冤家都在疑惑,学习Java应该选择什麼展开方向,这个我们在之前的文章中有提到过,Java展开在范围上有三个选择方向: 这是全国最大的大数据学习交流的地方,2000人聚集,不管你是小白还是大牛, 小编我都挺欢迎,今天的已经资讯上传到群文件,不定期分享干货, JavaEE,主要运用于企业级运用开发;安卓开发方向;嵌入式运用开发方向。在此建议大家选择JavaEE方...

lele989的博客 206

2026届大数据毕业设计选题推荐:Hadoop+Spark技术栈,50个高通过率题目详解

2026届大数据毕业设计选题推荐:Hadoop+Spark技术栈,50个高通过率题目详解

QQ_1340266386的博客 1351

大数据专业考研书_考研大数据:这些专业太抢手 你的排第几?

原标题:最新发布:这些专业太抢手!你的排第几?导读:“2015-2018全国考研大数据”来了!教育部全国硕士研究生招生考试网上报名和网上调剂唯一指定网站——研招网发布《2015-2018硕士研究生报考数据分析报告》!一起来看看!硕士研究生报名人数持续增长!女生为主力硕士研究生报名人数持续增长据教育部数据统计,2018年考研报考人数达到238万,增加人数和增长率均为近年来最高。△近4年硕士研究生报名...

weixin_39716105的博客 422

数据科学与大数据专业重要的不是学习

平时上LeetCode手,也要常逛GitHub、Kaggle这些社区,很技术问题和项目方案早有人分享过,能帮你节省大量自学时间。如果打算读研,最好尽早确定目标专业和院校,提前准备专业课,研究生在就业时通常比本科生有更选择,尤其在数据建模、分析等相关岗位上。参加技术沙龙、线上社群,和已经在行业工作的前辈交流。每个人的节奏不同,重要的是到适合自己的学习路径,保持主动,少做无用功。即使还没毕业,也可以参加春招、秋招招聘会,了解企业需要什么技能,有机会还能争取实习名额,提前锁定心仪岗位。

sjfxscz的博客 548

产品经理入门指南:从 0 到 1 的学习路径 + 看书籍 + 优质课程 + 实用网站推荐,少走弯路看这篇就够了!

产品经理入门指南:从 0 到 1 的学习路径 + 看书籍 + 优质课程 + 实用网站推荐,少走弯路看这篇就够了!

weixin_59191169的博客 2897

别瞎报专业!2025 最热门 25 大就业专业清单:含新增低空技术、智能分子工程,选对少走弯路

接下来其他热门专业还包括:电子信息工程、自动化、软件工程、临床医学、口腔医学、建筑学、电气工程、机械工程、材料科学、化学工程、环境工程、城市规划、心理学、教育学、法学、会计学、市场营销、国际贸易、物流管理等。内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

m0_59236602的博客 1482

Java面试——Kafka原理及应用

在实际应用过程中,为了提高消息的吞吐量,应用程序可以将Topic的Partition设置为个(Partition的个数也不宜太,一般依据集群大小和Topic上的数据量来决定,Partition的个数不能超过Broker节点的个数)​。Kafka个Consumer并发消费消息,如图所示,启动3个Consumer(因为Partition的个数为3,所以Consumer的个数也被设置为3)并发地消费TopicA上的消息,TopicA的数据以Partition的形式存储在3个Broker上。

吴声子夜歌的博客 100

媒体应用10-824

模拟电视时代,其画面比例为4:3,这是为了在模拟信号时代,让图像信号在水平和垂直两个方向上都能完全还原,画面比例4:3的设计是考虑到当时图像信号源的情况,为尽量不浪费画面的面积,达到最佳观看效果。指基于位置的服务,它通过移动设备的定位功能来获取用户的位置信息,并提供相关的服务,如导航、本地搜索等。两个维度上将连续信号离散化的过程,信号幅度的离散化即幅度值的量化过程,由于量化导致的幅度表示值与连续信号实际值之间的误差即为量化误差,也可以认为是量化引入了所谓的量化噪声。方式是一种特殊的输入/输出控制方式。

lovemelovefish的博客 591

一条 SQL 顶一条 Flink 链路?Doris Streaming Job 持续导入全景解析

Streaming Job 的意义不在于"又了导数方式",而在于 Doris 把**数据接入**这件事的默认形态从"搭一条外部管道"变成了"发一条 SQL"。对于大量只需要镜像同步 + 轻量加工的实时数仓场景,架构里可以直接少掉 Kafka 和 Flink 两层。

一入大数据深似海?别怕!“数据极客圈”就是你的救生圈,走对圈子跟对人,趣析数据、畅聊趋势,快进圈子! 362

高职单招培训学校哪家专业

2026年单招的号角已经吹响,选择微畔,让你的每一分努力都用在刀刃上,明年这个时候,你拿到录取通知书的样子,一定很酷。作为深耕职教升学领域年的“老兵”,微畔教育不是单纯的卖课,而是构建了一个完整的“技术+教学”双驱动的备考生态。他们会把枯燥的医学知识、计算机原理通过实际场景讲给你听,让听不懂的“天书”变成有趣的“故事”。很学生反馈,听微畔的课“3小时都不困”,还能“顿悟”以前不会的知识点。分析你的做题记录,精准到你的薄弱项,让你刷的每一道题都有效,而不是浪费时间在旧题废题上。

Mingprime的博客 146

《Hadoop 高可用集群与 OpenStack Mitaka 控制节点部署全流程实操排坑指南》

本文完整复盘 Hadoop 高可用集群与 OpenStack Mitaka 控制节点部署实操。基于 ZooKeeper 三节点集群实现 HDFS、YARN 高可用,完成主备自动故障切换验证;搭建 OpenStack 基础环境,部署数据库、消息队列并调通 Keystone 身份认证。记录进程残留、端口占用、配置不同步等分布式场景常见故障与解决思路,适合大数据与云平台运维实操学习参考。

2401_86047009的博客 671

头歌实践教学平台:大数据存储2023(十二)

十二、Hive基本查询操作(二) 第1关:Hive排序 第2关:Hive数据类型和类型转换 第3关:Hive抽样查询 有任何问题都可以随时关注私信!

有任何问题都可以随时关注私信! 243

Elasticsearch 学习笔记筑基-文档操作篇

本文全面系统地介绍了 Elasticsearch 文档操作的核心知识,涵盖文档的新增(指定ID、自动生成ID、创建式新增)、更新(全量更新、部分更新、脚本更新、批量更新)、查询(ID查询、字段过滤、批量查询)和删除(ID删除、批量删除、按查询删除)四大操作。文章不仅提供了详细的语法示例和返回结果解析,还通过实际应用场景(用户管理、商品管理、日志记录、订单管理、计数器)展示了如何在实际项目中应用这些操作。最后,总结了最佳实践建议、常用命令速查、返回结果字段详解和注意事项,帮助开发者高效、安全地使用 Elast

2201_75455813的博客 237

国产化 MOVEit 替代:文件传输架构与安全能力深度解读

企业在推进MOVEit 替代项目时,不仅要求功能完整对标原有平台,还需要架构自主可控、安全能力补强、支持平滑迁移,而 Ftrans 飞驰云联自研《Ftrans SFT 文件安全传输系统》,是落地MOVEit 替代成熟国产化方案。配套完整迁移实施工具,批量迁移账号、目录权限、传输任务策略。企业开展MOVEit 替代项目时,优先选择具备完整知识产权、全栈信创适配、成熟迁移实施经验的国产 MFT 平台,既能规避海外软件持续存在的安全隐患,又能搭建长期稳定、自主可控的企业文件安全传输底座。

2501_93735157的博客 373

头歌实践教学平台:大数据存储2023(六)

六、HBase 开发:批量操作    第1关:批量获取数据    第2关:批量删除数据    第3关:批量导入数据至HBase 有任何问题都可以随时关注私信!

有任何问题都可以随时关注私信! 227

一套同城O2O系统如何覆盖个行业? 外卖、跑腿、家政、预约服务一体化开发详解

同城O2O系统已经成为企业布局本地生活市场的重要工具。通过模块化开发,一套成熟的同城O2O系统可以同时覆盖外卖配送、同城跑腿、家政服务、酒店餐饮预约等个业务场景,实现用户端、商家端、配送端和管理后台的一体化运营。

wy15564849548的博客 178
上一篇: GDB 用法和命令介绍
下一篇: GDB调试精粹及使用实例
科学帝威
博客等级 码龄11年 44粉丝 48原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值