首页
社区
课程
招聘
[原创]如何通过 ETW Provider 来记录应用日志
发表于: 2025-2-6 15:55 3806

[原创]如何通过 ETW Provider 来记录应用日志

2025-2-6 15:55
3806

最近在做一些性能优化的时候,发现很多应用经常会出现文件 I/O 爆高,但又没做啥事情。结果分析下来发现,都是在写日志。

于是就有了这么一篇,怎么利用 Windows 自己提供的 ETW 来记录应用日志。

ETW(Event trace for Windows) 是 Windows 提供的一种事件跟踪机制,可以用来记录应用程序的运行时事件。

ETW Provider 提供的日志相比文件日志,主要有以下优点:

作为普通应用程序,没法直接使用微软的标准库来做,这里会相对麻烦一点。但通过微软提供的一些工具,可以稍微提升一定的效率。

我们采取基于清单的方式来创建 provider。

我们可以通过 SDK 中自带的图形化工具(ecmangen.exe)来生成清单文件。

如果你安装了 8.1 的 SDK,你可以在 C:\Program Files (x86)\Windows Kits\8.1\bin\x64\ 找到它。

如果你没安装,可以在附件中下载到。


打开它,会得到一个这样的应用:

然后就可以开始创建 provider 了。

选择【Events Section】部分,右击,选择【New】-【Provider】

根据提示,填写好 NameSymbolGUID(可以自动生成一个)、Decoding file locations(这个可以后面再进行修改的)

如下图所示:

下一步,我们就要开始创建我们的 event 了。开始 Event 之前,我们需要先创建一些关键属性处理,以方便 Event 创建的时候进行选择。

关于基础属性,详细介绍可以看:ETW:Windows 事件追踪

这里,我们需要创建或修改的有:

还有额外的一些属性可以按需使用。

关键就是创建 Event 了,这是对日志的直接表达。

需要定义 Symbol、EventId、Event Version(主要用于版本管理)和一些基础属性,这个需要根据业务定义来。

如下是场景激活事件的事件详情,供参考。

然后按需完成事件的增加。满足需求后,通过【File】-【Save/Save As】将 man 文件保存即可。

于是我们就得到了我们的 xxx.man 清单文件。

创建完清单文件,接下来就可以通过清单文件生成宏信息,在代码中调用更方便。

这里需要用到 mc.exe,可以通过 man 文件来生成 .h.rc.bin文件。

mc.exe 是跟随 win10 的 SDK 带下来的。

于是,我们就可以创建 VS 项目,然后引入 .h 和 .rc 进行使用了。

这里需要把 .h 和 .rc 和 bin 文件加到项目中。

然后,就可以开始写代码了。.h 中有了较多的宏,所以写起来也非常的方便。

直接放代码:


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2025-3-25 09:30 被frendguo编辑 ,原因: 添加附件
上传的附件:
收藏
免费 31
支持
分享
最新回复 (7)
雪    币: 225
活跃值: (3001)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
让我看看
2025-2-10 19:02
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
图片怎么都挂了
2025-2-15 13:14
0
雪    币: 750
活跃值: (1198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
yazigegeda 图片怎么都挂了
已更新~
2025-3-25 09:30
0
雪    币: 32
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
看看
2025-3-26 11:51
0
雪    币: 0
活跃值: (211)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2025-5-3 13:50
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
mark
2025-5-21 14:50
0
雪    币: 202
活跃值: (291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark
2025-5-22 08:57
0
游客
登录 | 注册 方可回帖
返回