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);