6.1讲 DEBUG断点调试

前言

很多新手小白在学习的时候总会遇到一个问题:
我们一运行程序,只能看到程序最后的结果,但是这个程序究竟是怎么一步步运行出这样的结果呢?如果有一个工具能够让我们看到我们程序的执行流程该有多好~
这就需要用到新手小白编程的利器——断点调试工具Debug了。

啥是Debug?

首先,对Debug做一个简单的描述:
Debug:是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。
它的两大作用,查看程序执行流程,调试程序。

Debug怎么用?

我们将从以下几个角度来分析这个问题:

1.什么是断点?

你可以把断点理解成想让程序停止的然后来查看的位置
也就是我们人为指定的需要程序执行时停止的地方

2.怎么添加断点?

可以在目标代码行号前双击
在这里插入图片描述
注意:一些结构性代码上是无法添加断点的,比如大括号

3.如何启动断点调试?

可以选择导航栏的”小飞虫“以Debug的方式启动
在这里插入图片描述
注意:启动后会提示是否”确认试图切换“,选择switch
在这里插入图片描述

4.看哪里?

我们可以按F6让程序继续执行下一步

变量变化的窗口Variables--可以查看变量值的变化情况

在这里插入图片描述

控制台--可以查看输出的情况

在这里插入图片描述

5.结束之后该怎么办?

1.选择左侧栏Debug中的Terminate and Remove关闭打开的Debug窗口
在这里插入图片描述
2.取消断点:双击想取消的断点即可取消
3.切换回Java视图
在这里插入图片描述
以上就是新手小白DEBUG入门小技巧
这个还是需要多多使用才能熟练哦~
希望能帮到你~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内容简介 · · · · · ·   本书作为有关 Visual C++ Debugger的专著,是一本非常难得的好书。书深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行代码的过程和方法,说明了关于定位、分析及修复编程错误的方法,介绍了开发 Visual C++程序时所遇到的特殊调试问题。   本书是所有软件工程师的必读书籍,也可作为大专院校师生的参考资料。 目录 ······ 第一部分 代码开发技巧 第1章 编写好的代码. l.l 谁需要本书? l.2 教学方法 1.3 从何处开始阅读? 1.4 警告!并非所有的C/C++编译器都完全相同 · · · · · · (更多) 第一部分 代码开发技巧 第1章 编写好的代码. l.l 谁需要本书? l.2 教学方法 1.3 从何处开始阅读? 1.4 警告!并非所有的C/C++编译器都完全相同 1.5 语言无关的设计工具101 1.5.l 准备 1.5.2 模型! l.5.3 结构图、伪代码及IPO框图 l.6 好的程序设计的五点要素 1.7 规则意味着可以打破 1.7.1 安塞尔亚当斯(Ansel Adams)或毕加索(Picasso) 1.7.2 注释块 1.7.3 标识符:identifiers、IDENTIFIERS和Identifiers 1.7.4 间隔与缩进 1.8 数据类型 1.9 匈牙利表示法 l.9.1 MFC、句柄、控件及结构的命名规范 1.9.2 一般前缀命名规范 1.9.3 变量命名规范 1.9.4 应用程序符号命名规范 1.9.5 Microsoft MFC宏命名规范 1.9.6 库标识符命名规范 1.9.7 静态库版本命名规范 1.9.8 动态连接库命名规范 1.9.9 windows.h命名规范 1.10 操作符优先级 1.11 小结 第2章 使用编译器忧化 2.l 编码的责任与编译器的优化 2.2 Microsoft Visual C++的优化 2.2.1 调度指令 2.2.2 函数级连接 2.2.3 字符串池 2.2.4 使用register键字 2.2.5 常量和复制的传播 2.2.6 消除死代码和死存储 2.2.7 删除冗余于表达式 2.2.8 优化循环 2.2.9 降低强度 2.2.10 inline键字的使用 2.2.11 省略帧指针 2.2.12 关闭堆栈检查 2.2.13 覆盖堆栈 2.2.14 函数调用之间允许使用别名 2.2.15 全局优化 2.2.16 产生内部函数的内联 2.2.17 优化math.h 2.3 Microsoft C++的优化开关 2.4 使用 Microsoft Visual Studio设置编译器选项 2.4.1 Project Settings对话框的 General类型 2.4.2 Project Settings对话框的 Code Generation类型 2.4.3 选择结构对齐方式 2.4.4 Project Settings对话框的 Customize类型 2.4.5 Project Settings对话框的 Optimizations类型 2.5 建立发行版本的建议 2.6 小结 第3章 逻辑与语法错误 3.l 好的调试策略 3.2 四种程序错误类型 3.2.l 语法错误 3.2.2 连接错误 3.2.3 运行错误 3.2.4 逻辑错误 3.3 查看错误消息 3.4 预防性维护 3.4.l 桌面检查的含义 3.5 异常处理设计 3.6 “请多多支持” 3.7 Microsoft Visual C++的帮助 3.8 小结 第4章 debugger 4.l 确认Debugger可以使用 4.2 启动Debugger 4.2.1 Step Into和Step Over的区别 4.2.2 Go 4.2.3 Run to Cursor 4.3 理解Debugger工具栏图标 4.3.1 Restart 4.3.2 Stop Debugging 4.3.3 Break Execution 4.3.4 Apply Code Changes、Edit and Continue 4.3.5 Show Next Statement 4.3.6 Step Into 4.3.7 Step Over 4.3.8 Step Out 4.3.9 Run to Cursor 4.3.10 Quick watch 4.3.11 Watch 4.3.12 Variables 4.3.13 Regisers 4.3.14 Meomry 4.3.15 Call Stack 4.3.16 Disassembly 4.3.17 Debugger Toolbar Menu Equivalents 4.4 其他Debug菜单选项 4.4.1 Step Into Specific Function 4.4.2 Excmpions 4.4.3 Threads 4.4.4 Modules 4.5 本地菜单Debugger选项 4.5.1 List Members 4.5.2 Type Info 4.5.3 Parameter Information 4.5.4 Complete Word 4.5.5 Go Definition/Refefence 4.5.6 Go To Disassembly 4.5.7 Insert/Remove Breakpoint。 4.6 Debugger窗口 4.6.1 Trae窗口 4.6.2 Watch窗口 4.7 View菜单和Debugger窗口 4.7.1 Workspace 4.7.2 Output 4.8 以不同的数据类型查看观察变量 4.9 打开Just-in-Time调式 4.10 Options窗口Debug标签 4.10.1 Hexadecimal Display 4.10.2 Source Annotation 4.10.3 Code Bytes 4.10.4 Symbols 4.10.5 Parameter Values 4.10.6 Parameter Types 4.10.7 Return Value 4.10.8 Load COEF& Exports 4.10.9 Address 4.10.10 Format 4.10.11 Re-evaluate Expression 4.10.12 Show Data Bytes 4.10.13 Fixed Width 4。10.14 Display Unicode Strings 4.10.15 View Floating Point Registers 4.10.16 Just-in-Time Debugging 4.10.17 OLE RPC Debugging 4.10.18 Debug Commands Invoke Edit and Continue 4.11 键盘映射 4.12 Debugger快捷键 4.13 小结 第5章 调试版本与发行版本 5.l 缺省的调试版本建立与发行版本建立设置 5.2 为调试版本建立修改工程设置 5.2.l 修改调试选项 5.2.2 修改产生调试信息的格式 5.2.3 产生一个映射文件 5.2.4 重定向调试输入和输出 5.3 什么是.pdb文件? 5.4 什么是.dbg文件 5.5 调试优化的代码 5.6 打开Debugger的另一种方法 5.7 使用基本版或调试版本 5.8 C/C++运行调试库 5.8.l 旧版iostream.h和新版iostrearn之间的混乱 5.9 连接器参考资料 5.10 在调试版本检测发行版本错误 5.10.l 局部变量的自动初始化 5.10.2 检查函数指针调用稚栈的合法性 5.10.3 检查调用堆栈的合法性 5.11 TRACEN 5.12 VEAIFY宏 5.13 移植Visual C++旧的32位版本 5.13.l 转换早期的32位工作空间和工程 5.13.2 与Visual C++以前的版本共存 5.14 小结 第二部分 面向过程的环境 第6章 定位、分析和修复命令行代码错误 6.l 快速启动调试 6.1.l 启动Debugger的快速方法 6.1.2 变量初始化跟踪 6.1.3 小心调试代码 6.1.4 快速查看变量的内容 6.1.5 途停止Debugger 6.1.6 执行到代码的指定行 6.l.7 全速执行到一个断点 6.1.8 运行至光标处 6.1.9 现在测试 6.2 高级Debugger技巧 6.2.l 使用新值运行 6.2.2 循环调试技巧 6.2.3 调用调试函数 6.2.4 递归调用与调用堆栈 6.2.5 查看反汇编代码 6.3 进一步观察变量 6.3.l 使用QuickWatch窗口 6.3.2 使用Watch窗口 6.4 小结 第7章 调试内联汇编语言代码 7.l 汇编语言初步 7.1.l 数据类型 7.1.2 寄存器 7.1.3 寻址模式 7.1.4 指针 7.1.5 协处理器 7.2 调试 7.2.l 减法运算 7.2.2 使用256位整数 7.2.3 程序循环 7,2.4 使用协处理器求和实数. 7.2.5 使用协处理器计算正切值 7.3 小结 第8章 在Windows代码定位、分析和修复错误 8.l 使用两台计算机调试 8.1.l 准备远程目标计算机 8.1.2 准备主计算机 8.1.3 启动调试会话 8.2 简明Windows入门 8.2.l 基本的Windows代码 8.2.2 调试文件详述 8.2.3 程序执行的情况 8.3 调试 8.3.l 一个动画位图程序 8.3.2 使用鼠标绘画 8.4 小结 第三部分 面向对象过程的环境 第9章 定位、分析和修复命令行的错误 9.l 高级调试工具 9.l.l 内存卸出 9.1.2 定位错误参数从何处传递而来 9.1.3 查找何处修改了指针 9.2 Class View窗口要素 9.2.1 ClassView窗口的 Grouped by Access功能 9.2.2 ClassView窗口的 Base Classes功能 9.2.3 ClassView窗口的 References功能 9.2.4 ClassView窗口的 Derived Classes功能 9.2.5 ClassView窗口菜单的其余项 9.2.6 ClassView窗口的Properities功能 9.2.7 在ClassView窗日添加文件夹 9.2.8 在文件夹之间移动类 9.2.9 隐藏或显不 ClassView窗口 9.3 调试ardc和argv[] 9.4 小结 第10章 使用MFC类库开发Windows程序 10.l 为什么使用类库 10.2 一个真正的基础类一一CObject 10.3 什么是应用程序向导和类向导 10.4 一个图形程序 10.4.l 使用AppWizard 10.4.2 使用 ClassWizard 10.4.3 建立AppWizard代码 10.4.4 AppWizard模板代码 10.4.5 在客户区的图形对象 10.5 剖面法 10.6 小结 第11章 定位、分析和修复 MFC Windows代码的错误 11.l 内存问题 11.1.l 有问题的代码 11.1.2 定位和分析 11.1.3 修复工程 11.2 绘图问题 11.2.l 有问题的代码 11.2.2 定位和分析 11.2.3 修改工程 11.3 小结 第四部分 标准模板库(STL) 第12章 STL编程实践 12.1 多体系结构.. 12.2 掌握 C++ 12.3 STL――进退维谷的数据结构 12.4 初识 STL 12.5 STL和HP公司 12.6 大众化的 STL 12.7 STL总览 12.8 ANSI/ISO C++接受STL的过程 12.9 STL基本组件 12.9.l 什么是容器? 12.9.2 什么是适配器? 12.9.3 什么是算法? 12.9.4 什么是迭代器? 12.9.5 其他的STL组件 12.10 完整的STL程序包 12.11 杂乱的C/C++家族 12.12 回顾数据结构 12.12.l 静态与动态 12.12.2 类型指针 12.12.3 VOid指针 12.13 复习匈牙利命名法 12.14 函数重载 12.15 函数指针 12.16 运算符重载 12.16.l 运算符和函数调用的重载 12.16.2 编写自己的重载运算符 12.17 从结构到模板 12.17.l template关键字 12.17.2 模板语法 12.17.3 模板函数 12.17.4 模板类 12.18 为什么STL比模板好 12.19 小结 第13章 定位、分析和修复STL代码的错误 13. l 从标准C++转向STL语法的过程出现的问题 13.1.l 用迭代器遍历容器 13.1.2 仔细研究迭代器 13.1.3 流迭代器 13.1.4 为什么使用end() 13.1.5 复制列表 13.1.6 列表的列表 13.1.7 STL字符串指针的麻烦 13.1.8 释放 STL指针 13.2 一个C++程序转变为STL语法的例子 13.2.l 第一步――更新aSingleCard类 13.2.2 第二步――更新 WarDeck类 13.2.3 第三步――修复STL代码的执行错误 13.2.4 第四步――更新Opponent类 13.2.5 第五步――运转的STL程序 13.3 STL语法的源文件Wargame.cpp 13.4 小结 第五部分 特殊的调试问题 第14章 使用DLL工作 14.l 创建一个基于MFC的动态链接库 14.1.l 头文件 Framer.h 14.1.2 源代码文件Framer.cpp 14.1.3 建立Framer.dll 14.2 创建使用DLL的主应用程序 14.2.l 头文件 DLLDemoView.h 14.2.2 源代码文件DLLDemoView.cpp 14.3 更加仔细地查看 14.3.1 远程调试 14.3.2 有问题的代码 14.3.3 改正后的代码 14.4 小结 第15章 使用ActiveX控件工作 15.1 开发一个 ActiveX控件 15.1.l 使用Colltrolwizard 15.1.2 Test Container 15.1.3 产生一个真实的Clock控件 15.2 调试 Clock控件 15.2.l 准备远程目标计算机 15.2.2 准备主计算机 15.2.3 开始调试过程 15.2.4 查找问题 15.3 小结 第16章 调试 COM、ATL和DHTML 16.1 COM对象模型 16.2 创建一个ATL多边形工程 16.2.1 优化模块代码 16.2.2 测试控件 16.3 调试ATLCOM控件 16.4 小结 第17章 STL和 MFC编程 17.l 产生一个STL和MFC应用程序 17.1.l 复数 17.1.2 模板语法 17.1.3 基本的应用程序代码 17.2 调试 17.3 小结
第一部分 概 述 第1章 调试工具简介 1 1.1.泄漏诊断工具 1 1.2.Windows调试工具集 3 1.3.UMDH 4 1.4.Microsoft.应用程序验证器 4 1.5.全局标志 9 1.6.进程浏览器11 1.7.Windows驱动程序开发包 12 1.8.Wireshark 14 1.9.DebugDiag 15 1.10.小结 15 第2章.调试器简介 16 2.1.调试器的基础知识 16 2.1.1.调试器类型 17 2.1.2.调试器命令 18 2.1.3.调试器的配置19 2.1.4.通过内核态调试器重定向用户 态调试器 24 2.1.5.是否使用KD 26 2.2.基本的调试任务26 2.2.1.键入调试命令27 2.2.2.解析调试器的提示信息27 2.2.3.配置和使用符号 29 2.2.4.使用源文件 38 2.2.5.分析命令40 2.2.6.修改上下文的命令60 2.2.7.其他的辅助命令 67 2.2.8.示例68 2.3.远程调试 70 2.3.1.Remote.exe 70 2.3.2.调试服务器 71 2.3.3.进程服务器与内核服务器 73 2.3.4.远程调试的符号解析74 2.3.5.远程调试的源代码解析 75 2.4.调试场景 75 2.4.1.调试非交互式进程(服务 或者COM服务器) 76 2.4.2.在没有内核态调试器的情况 下调试非交互式进程(服务 或者COM服务器) 77 2.5.小结 77 第3章.调试器揭密 78 3.1.用户态调试器的内幕78 3.1.1.操作系统对用户态调试器的支持78 3.1.2.调试事件的顺序 83 3.1.3.控制来自调试器的异常和事件 84 3.1.4.内核态调试器的调试事件处理105 3.2.控制调试目标 106 3.2.1.断点的工作原理 107 3.2.2.内存访问断点的工作原理 108 3.2.3.处理器跟踪 109 3.2.4.实时调试的线程状态管理109 3.2.5.通过用户态调试器来挂起线程 112 3.3.小结 113 第4章.符号文件与源文件的管理 114 4.1.调试符号的管理114 4.1.1.公有符号的生成 115 4.1.2.在符号库存储符号 117 4.1.3.在HTTP服务器上共享公有符号 119 4.2.源文件的管理 120 4.2.1.收集源文件信息 120 4.2.2.源文件信息的使用122 4.2.3.不带源文件修订控制的源文件 服务器 123 4.3.小结 125 第二部分.调 试 实 践 第5章.内存破坏之一—栈 127 5.1.内存破坏的检测过程128 5.1.1.步骤1:状态分析 128 5.1.2.步骤2:源代码分析 129 5.1.3.步骤3:使用内存破坏检测工具 133 5.1.4.步骤4:调整源代码 133 5.1.5.步骤5:定义回避策略 133 5.2.栈内存破坏133 5.2.1.栈溢出 142 5.2.2.异步操作与栈顶指针 147 5.2.3.调用约定的不匹配154 5.2.4.回避策略164 5.3.小结 166 第6章.内存破坏之二—堆 167 6.1.堆简介167 6.1.1.前端分配器 168 6.1.2.后端分配器 169 6.2.堆破坏181 6.2.1.使用未初始化状态181 6.2.2.堆的上溢与下溢 185 6.2.3.堆句柄的不匹配 195 6.2.4.重用已删除的堆块199 6.3.小结 205 第7章.安全 206 7.1.Windows安全概述 206 7.1.1.安全标识符 207 7.1.2.访问控制列表208 7.1.3.安全描述符 209 7.1.4.访问令牌211 7.2.安全信息的来源213 7.2.1.访问令牌213 7.2.2.安全描述符 215 7.3.如何执行安全检查 217 7.4.在客户端/服务器程序传播标识 218 7.4.1.远程认证与安全支持提供者接口218 7.4.2.模拟级别220 7.5.系统边界上的安全检查 220 7.6.安全故障的分析221 7.6.1.本地安全故障221 7.6.2.延迟初始化的安全问题 226 7.6.3.身份模拟的潜在安全问题 231 7.6.4.分布式COM错误 232 7.6.5.扩展命令!token的故障241 7.6.6.在Windows XP SP2上安装了 某个程序后发生DCOM激活故障243 7.6.7.通过跟踪工具来分析安全故障 247 7.7.小结 248 第8章.进程间通信 249 8.1.通信机制 249 8.2.本地通信分析 250 8.2.1.LPC的背景知识 251 8.2.2.调试LPC通信251 8.2.3.调试本地DCOM以及MSRPC通信 254 8.3.远程通信分析 260 8.3.1.RPC故障测定状态信息的使用 260 8.3.2.网络流量分析270 8.3.3.打破调用路径275 8.4.一些其他的技术信息277 8.4.1.远程认证277 8.4.2.RPC扩展错误信息 278 8.4.3.其他工具278 8.5.小结 279 第9章.资源泄漏 280 9.1.什么是资源泄漏280 9.2.高层流程 280 9.2.1.步骤1:找出潜在的资源泄漏 281 9.2.2.步骤2:什么东西正在泄漏 282 9.2.3.步骤3:初步分析 282 9.2.4.步骤4:资源泄漏检测工具 282 9.2.5.步骤5:制定回避策略 283 9.3.资源泄漏的可重现性283 9.4.句柄泄漏 284 9.4.1.存在泄漏的程序 285 9.4.2.步骤1和步骤2:它是不是一个 句柄泄漏 286 9.4.3.步骤3:初始分析 287 9.4.4.更复杂的程序290 9.4.5.步骤4:利用泄漏检测工具 292 9.4.6.句柄注入与!htrace 298 9.4.7.步骤5:为句柄泄漏制定回避策略 300 9.5.内存泄漏 301 9.5.1.一个简单的内存泄漏 301 9.5.2.步骤1和步骤2:是否存在泄漏, 以及泄漏的是什么资源 302 9.5.3.步骤3:使用内存检测工具 303 9.5.4.步骤4:回避策略 322 9.6.小结 322 第10章.同步 323 10.1.同步的基础知识 323 10.1.1.事件 323 10.1.2.临界区 325 10.1.3.互斥体 329 10.1.4.信号量 330 10.2.高层流程 331 10.2.1.步骤1:识别问题的征兆 331 10.2.2.步骤2:转储所有线程331 10.2.3.步骤3:分析线程的同步问题332 10.2.4.步骤4:修复问题334 10.2.5.步骤5:制定回避策略334 10.3.同步情况 334 10.3.1.死锁 334 10.3.2.第1种孤立临界区情况—异常 338 10.3.3.第2种孤立临界区情况—线程 结束 343 10.3.4.DllMain函数的注意事项 347 10.3.5.锁竞争 353 10.3.6.管理临界区 358 10.4.小结 361 第三部分.高 级 主 题 第11章.编写定制的调试扩展363 11.1.调试扩展简介 363 11.2.调试扩展示例 365 11.2.1.调试扩展模型 369 11.2.2.调试扩展示例的需求 371 11.2.3.头文件和代码组织 372 11.2.4.调试扩展的初始化 374 11.2.5.调试会话状态的变化 379 11.2.6.KnownStructOutput 379 11.2.7.退出调试扩展 379 11.2.8.Help命令的实现 380 11.2.9.dumptree命令的实现 381 11.2.10.KnownStructOutput函数的实现 384 11.2.11.取消命令的实现387 11.2.12.版本 389 11.2.13.调试扩展的构建389 11.3.小结 390 第12章.64位调试 391 12.1.Microsoft 64位系统 391 12.1.1.操作系统简介 392 12.1.2.在WOW64运行的32位程序 393 12.2.Windows x64带来的变化395 12.2.1.第1章—调试工具简介 396 12.2.2.第2章—调试器简介 397 12.2.3.第3章—调试器揭密 407 12.2.4.第5章—内存破坏之一—栈 411 12.2.5.第6章—内存破坏之二—堆 411 12.2.6.第7章—安全 412 12.2.7.第8章—进程间通信 413 12.2.8.第11章—编写定制的调试扩展414 12.3.小结 414 第13章.事后调试 415 13.1.转储文件基础 415 13.1.1.通过调试器来生成转储文件 417 13.1.2.通过ADPlus来生成转储文件 420 13.1.3.内核态转储文件的创建 421 13.2.转储文件的使用 423 13.2.1.转储文件的分析:访问违例 424 13.2.2.转储文件的分析:句柄泄漏 425 13.3.Windows错误报告 429 13.3.1.Dr.Watson 429 13.3.2.Windows错误报告的系统架构 434 13.4.企业错误报告 446 13.4.1.设置企业错误报告 447 13.4.2.通过企业错误报告来报告错误 449 13.5.小结 451 第14章.功能强大的工具452 14.1.调试诊断工具 452 14.1.1.分析内存泄漏或者句柄泄漏 453 14.1.2.编写定制的分析脚本 455 14.2.扩展命令!analyze 457 14.2.1.故障程序 457 14.2.2.分析结果 458 14.2.3.故障的跟进人员 462 14.3.小结 463 第15章.Windows Vista基础 464 15.1.第1章—调试工具简介 464 15.2.第2章—调试器简介 465 15.2.1.用户访问控制的副作用 465 15.2.2.启用内核态调试器 467 15.2.3.地址空间布局的随机化 468 15.3.第6章—内存破坏之二—堆 469 15.4.第7章—安全性 473 15.4.1.用户访问控制 474 15.4.2.调试器的UAC 475 15.4.3.注册表和文件虚拟化 479 15.5.第8章—进程间通信 481 15.6.第9章—资源泄漏 482 15.7.第10章—同步482 15.7.1.轻量读写锁 482 15.7.2.条件变量 483 15.7.3.单次初始化 484 15.7.4.增强线程池 484 15.8.第11章—编写定制的调试扩展 484 15.9.第13章—事后调试485 15.10.小结487 附录A.应用程序验证器的测试设置488

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值