GoReplay开源工具使用教程

news2024/12/5 2:53:40

目录

一、GoReplay环境搭建

1、Mac、Linux安装GoReplay环境

二、GoReplay录制与重播

1、搭建练习接口

2、录制命令

3、重播命令

三、GoReplay单个命令

1、常用命令

2、其他命令

3、命令示例

4、性能测试

5、正则表达式

四、gorepaly组合命令

1、组合命令实例

2、gorepaly注意事项


一、GoReplay环境搭建

1、Mac、Linux安装GoReplay环境

1,项目下载地址:

https://github.com/buger/goreplay/releases/tag/1.3.3

2,mac、Linux可以直接在终端输入

curl -L -O https://github..com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_mac.tar.gz

3,解压压缩包

tar -zxvf gor_1.3.3_mac.tar.gz

4,配置环境变量,mac、Linux修改/ect/profile文件,在末尾添加

# 配置goreplay环境变量
GOR_HOME="yourPath/goreplay"
export PATH="$GOR_HOME:$PATH"

5,验证环境,显示版本号就安装完成

gor version

二、GoReplay录制与重播

1、搭建练习接口

你可以通过调用快速启动服务器gor file-server :8000,这将在端口上启动当前目录的简单文件服务器8000

gor file-server :8000

2、录制命令

1,录制所有http请求,以下命令是录制5000端口全部的http请求,接受之前的录制文件./log/logrequests_0.gor,并且把新的录制文件输出到./log/logrequests.gor文件,请注意,默认情况下 GoReplay 不跟踪响应,您可以使用--output-http-track-response选项启用它们,在文件名中使用日期变量:%Y-%m-%d-%H

sudo gor --input-raw 127.0.0.1:5000 --output-stdout --output-file='./log/logrequests.gor' -output-file-append --output-file-max-size-limit "4294967296"

  • --input-raw- 用于捕获HTTP流量,您应该指定IP地址或接口和应用程序端口。有关捕获和重放流量的更多信息。
  • --input-file- 接受之前使用 录制的文件--output-file。有关从文件保存和重播的更多信息

3、重播命令

1,下列这行命令展示了使用录制的文件重播请求,所有记录的请求都到达第二个服务器,并且它们将以与记录时相同的顺 序和完全相同的时间重播。--input-file参数接受录制的文件,--output-http参数接受需要重播的服务器,出现FileInput: end of file 提示,说明重播完成

gor --input-file='./log/logrequests_0.gor' --output-http='http://127.0.0.1:5000'

三、GoReplay单个命令

1、常用命令

当您需要仅捕获流量的特定部分(例如 API 请求)时,匹配非常有用。可以按 URL、HTTP 标头或 HTTP 方法进行匹配,匹配方式使用正则表达式。

-http-allow-header value 根据请求头匹配,其他内容将被排除
-http-allow-method value 根据请求方式匹配,其他内容将被排除
-http-allow-url value 根据请求url匹配,其他内容将被排除

-http-disallow-header value 根据请求头匹配,其他内容将被记录

-http-disallow-url value 根据请求url匹配,其他内容将被记录

-http-header-limiter value 根据请求头,接受一部分请求
-http-param-limiter value 根据url,接受一部分请求

-http-original-host 保留原始请求头,默认gor会用--output http提供的主机替换Host http头
-http-rewrite-header value 根据匹配的内容重写请求头
-http-rewrite-url value 根据匹配的内容重写请求url
-http-set-header value 向请求中添加额外的请求头
-http-set-param value 设置请求中的param参数,如果已经存在,将会被覆盖
-input-file value 从文件读取请求
-input-file-loop 循环读取文件,一般用于性能测试

-input-raw value 从给定端口捕获流量,需要root权限

-input-tcp-secure 启用TLS证书,需要指定证书跟密钥

-input-tcp-certificate string TLS开启时,指定的证书路

-input-tcp-certificate-key string TLS开启时,指定的密钥路径

-output-file value 将请求写入文件

-output-file-queue-limit int 区块队列的长度。默认值:256

-output-file-size-limit value 每个区块的大小。默认值:32mb

-output-http value  将传入请求转发到给定的http地址

--output-http-track-response 默认情况下 GoReplay 不跟踪响应,加上这个参数跟踪响应

--input-raw-track-response 默认情况下input-raw不拦截响应,仅拦截请求。您可以加这个参数开启响应跟踪。启用后,您将能够访问中间件和output-file

--input-file-dry-run 试运行模式,来预览需要多长时间以及给定文件输入中有多少个请求。它还会告诉您有用的信息,例如请求之间的最短和最长时间,以及第一次请求的时间。

--input-raw-max-wait 跳过大的延迟,选项(以秒为单位),该选项允许跳过录制文件中的长时间停顿。

--input-raw-allow-incomplete  如果打开,Gor将记录丢失数据包的HTTP消息

2、其他命令

-input-raw-engine libpcap 选择libpcap(默认)或者`raw_socket`拦截流量

-output-http-debug  启用http调试输出。

-input-raw-realip-header string 如果不为空,默认在请求头加上实际ip,X-Real-IP

-input-raw-track-response 如果启用,Gor将跟踪请求之外的响应,并且它们将可用于中间件和文件输出

-input-kafka-host string 向Kafka发送请求和响应统计信息
-input-kafka-json-format 启动表示消息是json格式而不是GoReplay格式
-input-kafka-topic string 向Kafka发送请求和响应统计信息

-output-kafka-host string  从Kafka读取请求和响应统计信息

-output-kafka-json-format  如果启用,它将把消息从GoReplay文本格式序列化为JSON

-output-kafka-topic string 从Kafka读取请求和响应统计信息

-input-dummy value 用于测试输出。每1s发出'get /'请求

-output-file-append  刷新的块是否附加到存在文件,只保留一个流量文件

-output-file-flush-interval duration 强制刷新文件缓冲区的时间间隔,默认为1s,一般不需要改动

-output-http-elasticsearch string 向ElasticSearch发送请求和响应统计信息

-output-http-redirects int 启用重定向的频率

-output-http-response-buffer int HTTP响应缓冲区大小,此大小之后的所有数据都将被丢弃

-output-http-stats  每5秒向控制台报告一次http输出队列统计信息

-output-http-timeout duration 指定HTTP请求/响应超时。默认情况下为5s

-output-http-track-response 如果启用,HTTP输出响应将设置为所有输出,如stdout、file等

-output-http-workers int 以多少个协程同时产生http请求,默认是动态,官方文档显示无限制,实际代码中设置了10,这块有争议

-output-null 用于测试输入。删除所有请求

-output-stdout 用于测试输入。只是将来自输入的数据打印到控制台。

-output-tcp value 用于Gor实例之间的内部通信sh

-output-tcp-secure 使用TLS安全连接–另一端的输入文件也应该打开TLS

-output-tcp-stats 每5秒向控制台报告一次TCP输出队列统计信息

-verbose 启用更详细的输出

3、命令示例

命令区分大小写,参数后面的精准匹配的时候不区分大小写,用正则表达式区分大小写

1,提示-bash: !': event not found,输入echo $-显示himBH,原因是确认是由于 H - histexpand 模式打开了导致。命令行下,双引号里面用了 ! 的话,Shell 会以为要执行历史展开,从而导致报错,解决方法:关闭 histexpand,输入set +H,再输入echo $-显示himB就可以了。

2,把双引号替换成单引号

从perf文件读取请求,添加param参数goreplay=1,添加header信息'perf':'yes',保留原始请求头,匹配url为^/user/authgetUserInfo$,输出到perf.log文件

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ^/user/authgetUserInfo?.+

试运行模式,您无需执行实际重播即可获取有关文件内容的信息。仅支持goreplay1.3版本以上
例如,它可以告诉您文件中有多少个请求,以及重播这些请求需要多长时间。
报告示例:

gor --input-file=流量文件 --output-stdout --input-file-dry-run

找到的记录:192

格式错误的记录:<nil>

已处理的文件:1

处理的字节数:88512

最大等待时间:71.369ms

最短等待时间:15.884ms

首次等待:55.401ms

以目前的速度重放需要7.82033秒。

找到0条时间戳不正常的记录

添加请求头,goreplay:1

goreplay --input-file='perf' --http-original-host  --output-file='perf.log' --http-set-header 'goreplay:1'

添加param参数,perf=1

goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-param 'goreplay=1'

匹配header的Host字段包含baidu.com

goreplay --input-file='perf' --http-original-host  --output-file='perf.log' --http-allow-header '^Host: .*.baidu.com.*'

匹配url为/user开头的所有接口,后面路径包含空用*,不包含空用+,[^\/]表示除了匹配/所有的字符

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ‘^\/user.+’

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user/[^\/]'

匹配以getUserInfo结尾的所有接口

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ‘^.*getUserInfo?.+’

匹配url为/user开头,排除结尾是/getUserInfo的所有接口,输出到perf.log文件

以下是用--http-allow-url搭配--http-disallow-url参数组合匹配的结果,同时满足a跟b两个条件,可以正常匹配 

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ’^\/user.*$' --http-disallow-url '.*getUserInfo$‘

更新头部信息跟param参数,如果参数存在,则更新,如果不存在,则添加,不能删除

goreplay --input-file='perf_0.log' --http-set-param 'goreplay=0' --http-set-header 'perf':'no' --http-original-host  --output-file='perf.log' 

重写请求url,匹配/user开头的url重写为/api/user开头,当重写跟匹配url一起时,先匹配url再重写url,需要匹配的url是重写之前的url

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log'  --http-rewrite-url '/user/([^\/]+):/api/user/$1' --http-allow-url '^\/user.*$'

重写版本号,user重写为userv2

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '^/user/([^/]):/userv2/$1' --http-allow-url '^/user/[^/]'

匹配/user/orders/detail开头,结尾是大写字母+数字,8到18位的字符串

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^/user/orders/detail/[A-Z0-9]{8,15}'

可以同时匹配到,/user/orders/detail/LBL67047,/user/orders/detail/GSHN7W61400M120,用^/user/orders/detail/[a-z0-9]{8,15},不能匹配大写字母

4、性能测试

  • 以50%的速度回放
  • goreplay --input-file='perf'  --http-original-host  --output-tcp '127.0.0.1:5000:50%'  
  • 以秒50的速度回放
  • goreplay --input-file='perf'  --http-original-host  --output-tcp '127.0.0.1:5000|50'  
  • 文件回放完继续循环
  • goreplay --input-file='perf'  --http-original-host  --output-tcp '127.0.0.1:5000'  --input-file-loop
  • 从文件读取输出到http
  • goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout 
  • 从文件读取,输出到http,同时指定python中间件处理
  • goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'

5、正则表达式

  • 注意:goreplay无论哪个版本都不支持正反向正向预查和负向预查
  • 匹配以/user开头,^/user
  • 匹配以/user结尾,/user$
  • 匹配1个或1个以上,+
  • 匹配0,1或1个以上的,*
  • 匹配0或者1个,最多一个多,?
  • 匹配否定字符,[^]表示匹配任何字符集包括\n,[^abc]表示匹配非a或者b或者c的字符集,匹配u/s/e/r中的任一字符,[user]
  • 匹配a-z区间所有的大小写字母,[a-z][A-Z]
  • 匹配所有的字母下划线,/\w\g
  • 精准匹配以/abt开头/userinfo结尾,^/abt/userinfo$,可以匹配到/abt/userinfo,不能匹配到/abt/userinfo/a, /a/abt/userinfo,/abt/a/userinfo
  • 匹配以/abt开头/userinfo结尾,中间至少一个路径,^/abt/\w+/userinfo$,匹配/abt/aaa/userinfo,不能匹配/abt/userinfo,匹配以/abt开头/userinfo结尾,中间0-1一个路径,^/abt/\w*/userinfo$,匹配abt/aaa/userinfo,abt/userinfo
  • 匹配/user/orders/detail接口结尾是大写字母跟数字16位组合,^/user/orders/detail/[A-Z0-9]+$,/user/orders/detail/GSHN7Q02C002006
  • 匹配以'/user'开头并且不以'/auth/getUserInfo'结尾的任意字符串,^\/user(?!\/auth\/getUserInfo).*$ (不能在gor使用)
  • 匹配,/user/orders/track/GSHN7B38R00NGA4,/user/auth/mc/getKey,/user/auth,排除,/user/auth/getUserInfo

四、gorepaly组合命令

1、组合命令实例

  1. 这里用到了改变速率命令,以500%的速度输出用|500%,以每秒500个请求输出用:500
    如果输出的文件名称跟时间相关,输出的文件名优先级高,比如14跟15点都是同一个快内,但是文件名会拆分成两个
    用--output-file-queue-limit 0设置队列为0
    gor --input-file 'perf|500%' --output-file '%Y-%m-%d-%H.log' --http-disallow-url '^/user/orders/detail/[A-Z0-9]{8,15}$' --http-disallow-url '^/\w.*.html$'  --output-file-queue-limit 0
  2. 用命令匹配url同时允许多个url,允许a-url,同时允许b-url,匹配的结果会包括aurl或者b-url的所有url,url=a+b
    gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-allow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
  3. 用命令匹配url同时不允许多个url,不允许a-url,不同时允许b-url,匹配的结果会包括除了满足a-url或者b-url的所有url,url=url-(a+b)
  4. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-disallow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-disallow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
  5. 用命令匹配url一个允许一个不允许,允许a-url,不同时允许b-url,匹配的结果会包括满足a-url减去b-url的所有url,url=a-b
  6. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-disallow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
  7. 用命令匹配允许url并且重写url跟header,允许a-url,允许b条件,重写a-url为/api/a-url,重写header为User-Agent: gor,允许处理原始数据,然后处理重写url跟header,输出后的内容,url=/api/a+b,header=重写后的a+重写后的b
  8. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-allow-url '^/pdsearch/[0-9a-zA-Z]+/.+$'  --http-rewrite-url '(^/user/[a-zA-Z]+/[a-zA-Z]+?.+$):/api$1' --http-set-header 'User-Agent':'gor' --output-file-queue-limit 0
  9. 从url录制所有的请求,需要root权限
  10. sudo gor -input-raw '127.0.0.1:5000' --output-file 'test.gor'  --output-stdout --output-file-queue-limit 0
  11. gor命令搭配中间件处理
  12. gor --input-file 'test.gor|800%' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'

2、gorepaly注意事项

1,gor录制的时候,流量会存在不完整的情况,如果直接使用中间件处理,容易报错或者出现异常,如果出现异常后,没有日志返回结束或者nohup.txt没有返回,但是gor进程已经结束了,这种情况需要手动关闭node中间件进程

2,出现异常流量的时候,建议更换流量文件或者先用gor回放到文件,然后在使用回放后的文件用中间件处理

3,回放时直接使用中间件&gor命令回放到服务器时,会消耗部分性能,比直接从流量文件回放效率低,建议流量文件先使用中间件或者命令回放一次到文件,然后直接使用文件回放到服务器,这样效率较高

4,录制的流量包体过大,需要加参数,--input-raw-override-snaplen

5、 回放流量的时候,有时候会流量波动大,偶尔流量比较小,需要加上参数--input-file-max-wait=200ms,允许跳过录制文件中的超过200ms的延迟

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

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

相关文章

论文:IoU Loss for 2D/3D Object Detection

摘要:在2D/3D目标检测任务中,IoU (Intersection-over- Union)作为一种评价指标,被广泛用于评价不同探测器在测试阶段的性能。然而,在训练阶段,通常采用常见的距离损失(如L1或L2)作为损失函数,以最小化预测值…

CAD 文件 批量转为PDF或批量打印

CAD 文件 批量转为PDF或批量打印,还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索,DWG To PDF.pc3 ,获取到文件目录 ,替换到代码中, originalValue ACADPref.PrinterConfigPath \ r"C:…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题,在Anaconda Prompt里输入jupyter notebook后可以打开浏览器,但打开具体项目后就会显示“服务器错误:Forbidden”,终端出现: tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践

❓ 为什么不在MacOS本机安装呢?因为M系列芯片是Arm架构,与生产环境或者在本地调试时候,安装虚拟镜像和X86不同,造成不必要的切换环境的额外成本,所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…

网络编程相关 API 学习

目录 1. 网络编程中的基本概念 2. UDP 的 socket api 的使用 (1) DatagramSocket API (2) DatagramPacket API (3) InetSocketAddress API (4) 使用 UDP 的 socket api 3. TCP 的 socket api 的使用 (1) ServerSocket API (2) Socket API 1. 网络编程中的基本概念 客…

【Android】View工作原理

View 是Android在视觉上的呈现在界面上Android提供了一套GUI库,里面有很多控件,但是很多时候我们并不满足于系统提供的控件,因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢?答案是自定义View&#…

burp2

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

【阅读记录-章节5】Build a Large Language Model (From Scratch)

目录 5. Pretraining on unlabeled data5.1 Evaluating generative text models5.1.1 Evaluating generative text models5.1.2 Calculating the text generation loss评估模型生成文本的质量 5.1.3 Calculating the training and validation set losses 5.2 Training an LLM5.…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

DDD架构设计

今天的应用架构&#xff0c;意指软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。在应用开发中架构之所以是最重要的第一步&#xff0c;因为一个好的架构能让系统安全、稳定、快速迭代。在一个团队内通过规定一个固定的架构设计&#xff0c;可以让团队内能力…

再来聊聊总线机制

背景 之前写过一篇《KafkaPostgreSql&#xff0c;构建一个总线服务》&#xff0c;近期在实践过程中又踩了一些坑&#xff0c;有了一些新的体验&#xff0c;拿出来再说道说道。 我们说EventBus 是一种设计模式和编程工具&#xff0c;它简化了应用程序组件之间的通信。通过使用…

怎么做DNS污染检测

DNS污染是指通过恶意手段篡改DNS解析结果&#xff0c;导致用户访问错误或恶意网站的行为。这种行为不仅影响用户体验&#xff0c;还可能带来安全风险。以下是几种检测DNS污染的方法&#xff1a; 1. 使用在线DNS检查工具 可以使用在线工具如帝恩思旗下的拨测在线DNS检测工具等…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…

基于Java Springboot诗词学习APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开…

常见问题QA的前端代码

这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面&#xff0c;页面分为左右两部分&#xff0c;左侧用于展示对话记录&#xff0c…

CSS学习记录03

CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下&#xff1a; body {background-color: lightblue; } 通过CSS&#xff0c;颜色通常由以下方式指定&#xff1a; 有效的颜色名称-比如“…

【k8s】kubelet 的相关证书

在 Kubernetes 集群中&#xff0c;kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同&#xff0c;下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…

JavaWeb:Servlet (学习笔记)【1】

目录 一&#xff0c;Servlet介绍 1&#xff0c;简介 2&#xff0c;Servlet技术特点 3&#xff0c;Servlet在应用程序中的位置 4&#xff0c;Servlet在程序中到底处于一个什么地位? 二&#xff0c;servlet运行过程&#xff1a; 三&#xff0c;servlet路径配置 四&#x…

STM32-C语言基础知识

C语言基础知识 stdint.h简介 给寄存器某个位赋值 给位6赋值为1流程&#xff1a;先清0&#xff0c;再赋值 带参数的宏定义 建议使用do {…}while(0)来构造宏定义 条件编译 条件编译后面必须跟宏语句&#xff0c;如#if _LED_H 指针使用常见的2大问题 1、未初始化 2、越界使…