尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

在 microsoft-ui-xaml 中启用与禁用 XamlProfiler 框架侧插桩:单开关驱动的完整构建指南

在 microsoft-ui-xaml 中启用与禁用 XamlProfiler 框架侧插桩:单开关驱动的完整构建指南 在 microsoft-ui-xaml 中启用与禁用 XamlProfiler 框架侧插桩单开关驱动的完整构建指南【免费下载链接】microsoft-ui-xamlWinUI: a modern UI framework with a rich set of controls and styles to build dynamic and high-performing Windows applications.项目地址: https://gitcode.com/GitHub_Trending/mi/microsoft-ui-xaml导读本文围绕 activateframework.md 展开详细讲解 microsoft-ui-xaml 仓库中XamlProfiler 框架侧producer-side插桩的总开关一个 MSBuild 属性XamlProfilerEnabled如何通过预处理器宏XAMLPROFILER_ENABLED控制编译进Microsoft.UI.Xaml.dll的全部探针代码。读完本文你将掌握该开关的默认状态、源码中的三处构建联动点、手动验证开关生效的完整步骤以及为什么零售fre/Release构建永远不会携带这些探针。配套阅读可参考 frameworksidechanges.md探针发什么事件与 profilerworking.md消费者/Profiler 应用怎么消费事件。一、TL;DR整个 Profiler 只由一个开关控制XamlProfiler 的producer侧代码编译进Microsoft.UI.Xaml.dll的 ETW 树跟踪插桩被单一预处理器宏XAMLPROFILER_ENABLED门控而该宏又由一个 MSBuild 属性XamlProfilerEnabled驱动声明位置在 dxaml/Xaml.Cpp.Props。代码中的每一个 profiler#include和调用点都用#ifdef XAMLPROFILER_ENABLED包裹例如 dxaml/xcp/core/core/elements/uielement.cpp、dxaml/xcp/core/core/elements/ContentControl.cpp、dxaml/xcp/core/core/elements/Popup.cpp因此当宏未定义时编译器根本看不到任何探针代码零代码、零二进制体积增量、零 ETW 事件。关闭默认状态XamlProfilerEnabled为falseXAMLPROFILER_ENABLED从未被定义专属.cpp不被编译不产生任何事件。开启把该属性改为true仅一行重新构建即可。关键防线该属性在非 Debug 配置下被强制置为false所以即使有人把开关遗忘为true零售/fre 构建也永远不会编译进 producer 代码。注当前仓库 dxaml/Xaml.Cpp.Props 中实际的实现是默认false当ConfigurationDebug时置true即 Debugchk构建默认开启、其余配置一律关闭与文档描述非 Debug 强制关闭的效果完全等价。二、唯一的开关dxaml\Xaml.Cpp.Props在 dxaml/Xaml.Cpp.Props 中可以看到如下属性组!-- XamlProfiler producer master switch. The ETW tree-tracking instrumentation is enabled in Debug builds and disabled by default for all other configurations. -- PropertyGroup XamlProfilerEnabledfalse/XamlProfilerEnabled XamlProfilerEnabled Condition$(Configuration)Debugtrue/XamlProfilerEnabled /PropertyGroup对应原文档中的等价写法默认关闭 非 Debug 强关守卫PropertyGroup XamlProfilerEnabledfalse/XamlProfilerEnabled XamlProfilerEnabled Condition$(Configuration)!Debugfalse/XamlProfilerEnabled /PropertyGroup操作方式开启将第一行的值改为true然后重新构建关闭改回false默认值。第二行是保险守卫在任一非 Debug 配置下重新强制为false确保开启状态永远不会泄漏进零售/fre 构建。从仓库当前代码看这一守卫等价地表达为仅在 Debug 下为true。三、这个属性驱动了什么无需手动修改XamlProfilerEnabled通过Condition$(XamlProfilerEnabled)true门控三处构建点位。日常使用中无需逐一触碰这些位置——它们跟随上面的总开关联动。点位 1宏定义PreprocessorDefinitions文件dxaml/Xaml.Cpp.Targets文档所述路径宏在源码中的实际使用可参见前文列出的各.cpp文件PreprocessorDefinitions Condition$(XamlProfilerEnabled)true%(PreprocessorDefinitions);XAMLPROFILER_ENABLED1;/PreprocessorDefinitions点位 2宏定义-D镜像给导入 LibraryCompile.props 的项目文件dxaml/msbuild/BuildSettings/LibraryCompile.propsAdditionalOptions Condition$(XamlProfilerEnabled)true%(AdditionalOptions) -DXAMLPROFILER_ENABLED1/AdditionalOptions之所以存在两个宏定义点位是因为DBG1本身也同时在Xaml.Cpp.Targets与LibraryCompile.props中定义XAMLPROFILER_ENABLED镜像了这一覆盖范围从而保证每个消费项目都能拿到宏。点位 3专属.cpp的编译文件dxaml/xcp/components/comptree/lib/Microsoft.UI.Xaml.CompTree.vcxprojClCompile Condition$(XamlProfilerEnabled)true Include..\WucVisualTreeProfiler.cpp/WucVisualTreeProfiler.cpp是唯一一个专属 profiler 翻译单元translation unit实现在 dxaml/xcp/components/comptree/WucVisualTreeProfiler.cpp。它在文件顶部设有#error保护如果它被编译但XAMLPROFILER_ENABLED未定义编译会直接失败。由于三处点位共享同一个XamlProfilerEnabled属性它们因此自动保持同步杜绝了宏开了但.cpp没编译或反之的错位状态。装饰性条目仅影响项目成员展示无构建效果另有两处ClInclude条目同样受该属性门控分别位于 Microsoft.UI.Xaml.CompTree.vcxprojWucVisualTreeProfiler.h与 dxaml/xcp/components/base/lib/Microsoft.UI.Xaml.Base.vcxprojXamlProfilerTracing.h。头文件从不参与编译且其整体内容自带#ifdef XAMLPROFILER_ENABLED自我保护provider 与全部事件 schema 定义在 dxaml/xcp/components/base/inc/XamlProfilerTracing.h所以这两条仅影响解决方案资源管理器中的项目成员归属对构建产物没有任何影响。四、验证开关是否生效按照以下步骤可以验证开关的真实效果将XamlProfilerEnabled设为false默认值。执行构建.\initrun.ps1 build.cmd mux /q移除 profiler 后的干净构建应成功且输出的Microsoft.ui.xaml.dll相比开启状态可测量地更小约 50 KB——这是代码被排除的物理证据。若构建因WucVisualTreeProfiler.cpp中的#error失败说明XamlProfilerEnabled守卫失步单一属性机制下不应发生。挂载 profiler 或采集 ETW trace →不应出现任何 XamlProfiler 事件。将XamlProfilerEnabled设为true重新构建 → DLL 恢复完整体积事件重新流动。关于运行验证的补充离线录制时使用 profiler 项目自带的XamlProfiler.wprpWPR profile位于 tools/XamlProfiler可对同一 provider 记录.etl实时会话则以管理员权限运行XamlProfiler.exe后 Launch 并 Listen详见 profilerworking.md。五、注意事项与边界作用域profiler 通过 dxaml/Xaml.Cpp.Props 中的守卫行被限定在ConfigurationDebugchk。若要在某个特定 fre 版本中带上 profiler应调整该守卫行本身而不是去改三处独立点位。单一改动点三处构建点位和两处装饰性头文件条目都引用同一个XamlProfilerEnabled属性因此全仓库恰好只有一处需要修改的地方。与消费者解耦当 producer运行时 DLL变化时profiler 应用本身无需重新构建反之profiler 应用的变化也不要求重建运行时。producer 侧所有事件的语义定义见 frameworksidechanges.md 的完整事件 schema。【免费下载链接】microsoft-ui-xamlWinUI: a modern UI framework with a rich set of controls and styles to build dynamic and high-performing Windows applications.项目地址: https://gitcode.com/GitHub_Trending/mi/microsoft-ui-xaml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表