Pony最近支持了DTrace,功能很是强大,Windows下相似的动态跟踪工具还不成熟,最接近的NTrace仍是没开放的研究项目。git
退而求其次,我为尝试给Pony加了ETW(Event Tracing for Windows)支持(分支etw-tracelogging)。ETW其实更像是高性能的日志而不是动态跟踪,虽然也能拿到堆栈,可是性能、灵活性、安全性都差DTrace不少。实现方法也比较简单,就是把原来DTrace宏换成TraceLogging API调用。github
ETW在Windows 10后提供了TraceLogging
API,底层仍是ETW,可是极大地简化了使用:windows
声明Provider数组
一般在一个头文件里声明,而后在须要的模块里引用:安全
#include <TraceLoggingProvider.h> TRACELOGGING_DECLARE_PROVIDER(etw_provider);
定义Provideride
在C/C++源文件里进行定义,须要上一步的表示符,Provider的名字和一个GUID。工具
TRACELOGGING_DEFINE_PROVIDER( etw_provider, "Pony", (0x9d12063d, 0xc320, 0x4bee, 0x8f, 0x5f, 0x1a, 0x1d, 0xb5, 0x49, 0x52, 0x20) );
注册Provider性能
一般在程序开始时注册Providerspa
TraceLoggingRegister(etw_provider);
写事件3d
TraceLogging提供了不少宏来方便写事件,基本使用:
TraceLoggingWrite(etw_provider, "EventName", TraceLoggingUIntPtr(ptr, "Data1"), TraceLoggingFloat32(f1, "Data2"));
前两个参数provider和事件名是必填的,后面的可变参数能够填各类基础数据类型,还支持结构体、数组。
注销Provider
在程序结束的时候注销Provider
TraceLoggingUnregister(etw_provider);