爲Pony添加ETW支持

Pony最近支持了DTrace,功能很是強大,Windows下相似的動態跟蹤工具還不成熟,最接近的NTrace仍是沒開放的研究項目。git

退而求其次,我爲嘗試給Pony加了ETW(Event Tracing for Windows)支持(分支etw-tracelogging)。ETW其實更像是高性能的日誌而不是動態跟蹤,雖然也能拿到堆棧,可是性能、靈活性、安全性都差DTrace不少。實現方法也比較簡單,就是把原來DTrace宏換成TraceLogging API調用。github

在Windows Performance Analyzer查看事件

TraceLogging使用簡介

ETW在Windows 10後提供了TraceLogging API,底層仍是ETW,可是極大地簡化了使用:windows

  1. 聲明Provider數組

    一般在一個頭文件裏聲明,而後在須要的模塊裏引用:安全

    #include <TraceLoggingProvider.h>
    TRACELOGGING_DECLARE_PROVIDER(etw_provider);
  2. 定義Provideride

    在C/C++源文件裏進行定義,須要上一步的表示符,Provider的名字和一個GUID。工具

    TRACELOGGING_DEFINE_PROVIDER(
      etw_provider,
      "Pony",
      (0x9d12063d, 0xc320, 0x4bee, 0x8f, 0x5f, 0x1a, 0x1d, 0xb5, 0x49, 0x52, 0x20)
    );
  3. 註冊Provider性能

    一般在程序開始時註冊Providerspa

    TraceLoggingRegister(etw_provider);
  4. 寫事件3d

    TraceLogging提供了不少來方便寫事件,基本使用:

    TraceLoggingWrite(etw_provider, "EventName", 
      TraceLoggingUIntPtr(ptr, "Data1"),
      TraceLoggingFloat32(f1,  "Data2"));

    前兩個參數provider和事件名是必填的,後面的可變參數能夠填各類基礎數據類型,還支持結構體、數組。

  5. 註銷Provider

    在程序結束的時候註銷Provider

    TraceLoggingUnregister(etw_provider);
相關文章
相關標籤/搜索