使用wevtutil安装WPT清单文件时出现问题

4
我正在尝试为一款软件添加性能计数器和自定义事件,以便我可以使用Windows性能工具包程序(如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”对目录名称的奇怪选择性质。

提前致谢,

Tim.

3个回答

1

我曾经遇到过同样的问题 - 据我所知,wevtutil 存在目录长度限制。当我从路径较短的目录安装文件时,它可以正常工作。


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

谢谢Rich,我明天会试一下。 - Luther
我现在已经把我的全部搞定了,所以如果你还不能让你的工作起来,请告诉我,我会描述一下我所做的。 - RichS
啊,还是不行。我已经添加了'.rc'文件,至少包括两个名为“XXXXX_manifest.rc”和“XXXXX_profile_events.rc”的文件。 - Luther
1
让我困惑的是,如果输出目录在一个地方,它可以工作,但如果在另一个地方就不行。 - Luther

1
如果有人遇到同样的问题,你实际上可以从任意目录开始工作:
将用户读取和执行权限添加到包含或在项目上方的目录中:
icacls projectdir /grant BUILTIN\Users:(OI)(CI)(RX)
然后安装清单应该可以无错误地工作:
wevtutil im yourmanifest.man /rf:c:\full\path\to\yourprogram.exe /mf:c:\full\path\to\yourprogram.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接