在多个进程中或同一进程内注册相同的ETW TraceLogging提供程序GUID

4

根据TraceLogging文档:

如果您尝试注册已经注册的提供程序,则注册将失败。

不清楚"提供程序(provider)"是指GUID还是由hProvider表示的对象。有人能否确认以下操作是否有效: 1. 在多个进程中注册相同的GUID 2. 在同一进程中的多个模块(DLL/EXE)中注册相同的GUID 3. 在同一模块内注册相同的GUID?

我已经尝试了{1}和{2},它们都可以工作-我可以从进程/模块中获取事件。只需要确保这是预期行为即可。


我也对此很感兴趣。 - rnd_nr_gen
2个回答

0

我认为它指的是句柄对象本身。

TraceLogging提供程序句柄的范围严格限制在定义它的模块(DLL或EXE)中。一个模块中的提供程序句柄不得与其他模块中的代码共享。换句话说,对于任何句柄g_hProvider,所有的TraceLoggingWrite(g_hProvider, ...)实例必须驻留在与TRACELOGGING_DEFINE_PROVIDER(g_hProvider, ...)定义相同的EXE或DLL中。如果不遵循此规则,则TraceLoggingWrite的行为是不可预测的,特别是关于它处理事件ID的方式(例如,事件ID冲突很可能发生)。

TraceLoggingProvider.h中的注释。


0
在这份文档中,“提供者”指的是使用TRACELOGGING_DEFINE_PROVIDER定义的hProvider
可以有多个使用相同GUID的“提供者”变量。您可以有多个进程分别注册相同的提供者,或者在同一进程中有多个DLL,甚至可以有多个不同的TRACELOGGING_DEFINE_PROVIDER(每个都有不同的变量名)。它们中的每一个都是一个独立的提供者句柄,可以单独注册和注销。
显然,如果能避免,在同一个DLL中不要有多个执行相同功能的变量,这样更高效。
另外需要注意的是,GUID是一种契约。具有相同GUID的所有事件应该具有相同的提供者名称,并且关键字的定义也应该相同。共享相同的GUID的原因是为了让所有事件可以一起打开/关闭。如果有意义,请共享GUID。如果没有意义(如果事件不能一起工作),请考虑为新的事件组选择新的GUID和新的提供者名称。

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