4

我正在尝试将性能计数器和自定义事件添加到一个软件中,以便我可以使用 Windows Performance Toolkit 程序(例如 XPerf 和 GPUView)查看这些。我将使用我所有的克制力量避免对软件文档的状态以及我现在浪费在试图从网络上挑逗线索的时间进行宣泄咆哮。我将描述我如何到达现在的位置,以防万一这对其他迷失的灵魂有用。

到目前为止,我已经收集到我必须为我的性能计数器和事件编写一个事件清单。您可以手动或使用名为“ ecmangen.exe ”的工具来完成此操作。该程序的文档为事件创建清单提供了一个很好的分步指南,但没有解释如何将这些与您的代码集成。

据我所知,下一步是使用两个神秘的命令行应用程序“ MC.exe ”和“ CTRPP.exe ”。这些似乎会生成 C 或 C# 头文件、源文件和资源文件,分别用于将事件和计数器检测添加到您的代码中。接下来,您必须构建您的代码(查看 'C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\winbase\Eventing' 中的示例),然后我们来到我目前遇到的问题:正确使用下一个神秘工具“ wevtutil.exe

该工具需要两件事:您使用其中的资源编译的二进制文件(exe 或 DLL)以及用于生成这些资源的清单文件。我遇到的麻烦是它对二进制文件的位置非常挑剔,我一直无法确定这种挑剔的形式。咒语和山羊牺牲没有产生任何结果。

如果我在清单文件中的 'provider' 标记的 'resourceFileName' 字段中定义了一个路径,例如 'c:\MYDIR\TEd.exe',那就没问题了。但是,如果我将相同的 exe 放在不同的文件夹中(失败的是 C:\tw\TEd.exe),它会报错。

给出的错误消息是“警告:无法访问发布者 TEd-Event-Provider 资源。” 但没有更多解释为什么或它试图寻找的地方。

那么,我是否打算以错误的方式添加检测,是否已经有一个指南解释了所有的陷阱以及'wevtutil.exe 对目录名称的奇怪选择性的本质是什么。

提前致谢,

蒂姆。

4

3 回答 3

1

我刚刚收到完全相同的消息,并且在我有一个脑电波并阅读错误消息之前努力了一个小时来解决它;-)。

我的问题的解决方案是简单地将“.rc”文件添加到我的项目中,然后重新构建。回想起来很明显,但它让我难倒了一段时间。

希望这可以帮助。


编辑 - 2 月 4 日 好的,不太确定我是否知道您的问题是什么,但以下批处理脚本是我完成这一切的方式。祝你好运。

rem -------------------------------------------------------------------
rem Do all of this from the project directory

rem -------------------------------------------------------------------
rem Generate Header and Resource - remove the ReadOnly attrib to "help" it along
attrib -r MyModuleTracing.h
mc.exe -um MyModuleTracing.xml
rem This generates MyModuleTracing.h and MyModuleTracing.rc, add both to your project

rem -------------------------------------------------------------------
rem ** Now build the project **
rem -------------------------------------------------------------------

rem Register MyModule Tracing with the system
if exist MyModuleTracing.xml (
  wevtutil um MyModuleTracing.xml

  copy MyModuleTracing.xml Release
  cd Release
  copy MyModule.dll %SystemRoot%\System32
  wevtutil im MyModuleTracing.xml
)

rem -------------------------------------------------------------------
rem Do a capture, and also export the results to an XML file.
xperf -start MyModuleSession -on [REPLACE_WITH_YOUR_GUID] -f MyModuleSession.etl
xperf -on base -f Kernel.etl

rem Run the app, wait until exit, and then stop the capture
start /wait MyModule.exe

xperf -stop
xperf -stop MyModuleSession
xperf -merge MyModuleSession.etl Kernel.etl MyModuleSessionMerged.etl

tracerpt MyModuleSessionMerged.etl -o MyModuleSessionMerged.xml -of XML
于 2011-01-25T16:40:47.747 回答
1

我遇到了同样的问题——据我所知,wevtutil 有目录长度限制。当我从路径较短的目录安装文件时,它可以工作。

于 2011-08-25T15:34:22.440 回答
1

万一其他人遇到这种情况,您实际上可以从任意目录中获取工作:

将 USER Read&Execute privs 添加到包含或高于您的项目的目录:

icacls 项目目录 /grant BUILTIN\Users:(OI)(CI)(RX)

然后安装清单应该没有错误:

wevtutil im yourmanifest.man /rf:c:\full\path\to\yourprogram.exe /mf:c:\full\path\to\yourprogram.exe

于 2014-12-03T22:13:35.717 回答