堆栈标记
在 Windows® Performance Analyzer (WPA) 中,堆栈标记是用于创建标签(标记)的功能,以帮助你更好地识别受影响的调用堆栈部分。
了解堆栈标记和堆栈帧标记之间的区别
可以将堆栈(帧标记)和堆栈标记视为“堆栈”列中的相同数据的两个视图。 可以将堆栈列配置为在视图编辑器中作为堆栈标记或堆栈列(帧标记)进行查看。
调用堆栈由一个帧列表组成。 如果调用堆栈的形式为 A -> B -> C,则有三个帧:A、B 和 C。堆栈列(帧标记)相互映射,每个调用堆栈帧映射到一个标记,如果不存在标记,则默认映射到 module!method。
例如,调用堆栈 A -> B -> C-> D,在 堆栈 (帧标记) 视图可以变为 A -> FrameTagB -> FrameTagC -> D。每个帧标记都可以具有基于 *.stacktags 文件中标记定义的层次结构 (例如,FrameTagB 的实际值可以是“HTML\Script\OM”) 。
堆栈标记使用单个标记名称来汇总整个调用堆栈。 例如,最底层映射的帧标记通常成为堆栈标记,除非为标记指定了优先级。 还以 A -> B -> C -> D 为例,其中帧标记视图为 A -> FrameTagB -> FrameTagC -> D,堆栈标记视图只是:FrameTagC。
除了完全匹配的模块和方法的正常标记外,还可以定义 HintOperator 作为被调用方或调用方的 HintTag。 例如,为 B 定义了 HintOperator 作为被调用方的 HintTag。Stack (FrameTags) 视图的调用堆栈 A -> B -> C -> D 可以变为 A -> FrameTagB -> ModuleOfC -> D,其 StackTag 视图为 FrameTagB -> ModuleOfC。 C 的模块动态创建为新的堆栈标记。 将 HintTag 的 OnlyShowModule 属性显式设置为 false 会使 C 成为新的堆栈标记,而不是 ModuleOfC。 OnlyShowModule 属性默认为 true。 典型用例是自动指定 RPC 服务器函数的属性。 其直接调用方函数为 rpcrt4.dll!Invoke_epilog1_start。 为此,可以为此通用调用方函数定义 HintTag。
通过定义提示标记来标识通用函数的成本
通常,“堆栈标记”列用于标识单个模块中单个函数的成本。 但是,如果定义了提示标记和提示运算符,则 WPA 可以合并该函数调用的所有函数的成本。 提示标记是通用函数及其调用的函数组的标签,提示运算符将通用函数标识为调用函数(调用方)或被调用函数(被调用方)。
典型用例是定义提示标记,以便 WPA 自动指定 RPC 服务器函数的属性。 可能还需要定义提示标记,例如,显示锁持有者或分配堆的函数。
定义提示标记
提示标记和提示运算符在 XML 中按照以下语法定义,其属性和值如下表中所述。
<HintTag
Name="string-label"
Priority="integer"
HintOperator="caller-or-callee"
OnlyShowModule="Boolean">
<Entrypoint
Module="module-name"
Method="method-name">
</HintTag>
元素 | Attribute | 说明 |
---|---|---|
HintTag | 名称 | 要用作标签的字符串 |
Priority | 整数。 默认值为零。 | |
HintOperator | 值分别为“调用方”或“被调用方”,分别表示调用函数或被调用函数。 | |
OnlyShowModule | 布尔(可选)。 默认值为 true。 | |
入口点 | 模块 | 包含方法的模块的名称。 |
方法 | 作为入口点的方法的名称。 |
若要添加在 XML 文件中定义的提示标记,请使用本主题稍后将堆栈标记添加到堆栈标记定义文件中的过程。
使用提示标记的示例
请考虑下图中所示的示例数据。
在本示例中,在 WbemCore.dll 中调用了 4 个 RPC 函数:
- CWbemLevel1Login::NTLMLogin
- CWbemNamespace::GetObjectW
- CWbemNamespace::PutInstance
- CWbemNamespace::ExecMethod
能够合并调用这些函数的成本对于确定 RPC 服务器端函数的成本非常有用,因为 WPA 会在“堆栈标记”列中将总支出显示为 RPC。
通过将 rpcrt4.dll!Invoke 函数定义为提示标记 RPC 的入口点,并将提示运算符指定为被调用方,WPA 用 RPC 来表示 rpcrt4.dll!Invoke,用 RPC\wbemcore.dll\CWbemLevel1Login::NTLMLogin 来表示 wbemcore.dll!CWbemLevel1Login::NTLMLogin。 因此,在“堆栈标记”列中,WPA 将 RPC 服务器端函数 wbemcore.dll!CWbemLevel1Login::NTLMLogin 的成本显示为 31.855774ms。 在 WbemCore.dll 中,NTLMLogin 是被调用函数的层次结构中的顶级 RPC 函数。
提示标记 RPC 由以下 XML 定义。
<HintTag Name="RPC" HintOperator="Callee">
<Entrypoint Module="rpcrt4.dll" Method="Invoke"/>
</HintTag>
将堆栈标记添加到堆栈标记定义文件中
若要将堆栈标记定义添加到堆栈标记定义文件中,请执行下列操作:
在菜单中,选择“跟踪”,然后选择“跟踪属性”。 “跟踪属性”选项卡随即打开。
在“堆栈标记定义”区域中,在所需位置单击“添加”。
导航到包含堆栈标记文件的区域,将其选中,然后单击“打开”。
从堆栈标记定义文件中删除堆栈标记
若要从堆栈标记定义文件中删除堆栈标记定义,请执行下列操作:
在菜单中,选择“跟踪”,然后选择“跟踪属性”。 “跟踪属性”选项卡随即打开。
在“堆栈标记定义”区域中,选择要删除的堆栈标记定义,然后单击“删除”。
警告:请确保你确实想要删除所选堆栈标记定义,因为单击“删除”后,将不能选择取消。
重新加载堆栈标记定义文件
若要将堆栈标记定义重新加载到堆栈标记定义文件,请执行下列操作:
在菜单中,选择“跟踪”,然后选择“跟踪属性”。 “跟踪属性”选项卡随即打开。
在“堆栈标记定义”区域中,单击“重新加载”。 可以通过按住 Shift 键并左键单击每个堆栈标记定义来加载多个堆栈标记。
排查堆栈标记文件问题
若要调查 WPA 中堆栈标记文件中的问题,请执行下列操作:
在菜单中,单击“窗口”,然后选择“诊断控制台”。 WPA 显示画面将分为两部分 - 屏幕上半部分为“Graph 浏览器”和“分析”,屏幕下半部分为“诊断控制台。
提示:还可以通过单击 WPA 左下角的“诊断控制台”来访问诊断控制台。 打开后,还可以将其拖出到单独的窗口,或将其停靠在顶部或一侧。
“诊断控制台”列出了分析工作流过程中发生的异常的相关信息。 可以通过此控制台诊断符号解码问题。