c++ - 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
问题描述
我可以使用这种方法从我的应用程序中生成跟踪日志事件(能够在 Windows 性能分析器中查看它们) 。发出的事件如下
HRESULT CTracelogger::PublishEvent(void *pData)
{
if (pData)
{
EVENT_H sHEvent = *(static_cast<EVENT_H *>(pData));
TraceLoggingWrite(g_hEventProvider,
"HEvent",
TraceLoggingStruct(5, "HEventData"),
TraceLoggingUInt32(sHEvent.m_eEventType, "eEventType"),
TraceLoggingUInt32(sHEvent.m_uiVersion, "Version"),
TraceLoggingUInt32(sHEvent.m_uiPid, "Pid"),
TraceLoggingUInt32(sHEvent.m_uiSize, "Size"),
TraceLoggingWideString(sHEvent.m_wszHName, "HName")
);
}
return S_OK;
}
我试图通过编写自定义消费者来在不同的应用程序中使用相同的事件,消费者正在接收事件(因为正在接收相应的提供者 GUID 事件)。我正在尝试使用 TdhGetProperty() 访问与事件关联的用户数据,如此处的文档中所示,但是如果变量 buffersize 初始化为 0,则函数 TdhGetEventInformation() 失败并出现 ERROR_NOT_FOUND 并且如果 buffersize 初始化为 a 则失败并出现错误 ERROR_INVALID_PARAMETER非零值。
上述方法是否正确检索与跟踪记录事件关联的数据?如果是,那么为什么 TdhGetEventInformation() 失败了?
VOID WINAPI CEventLogger::EventRecordCallback(PEVENT_RECORD pEvent)
{
DWORD status = ERROR_SUCCESS;
PTRACE_EVENT_INFO pInfo = NULL;
char msgbuf[4096];
DWORD BufferSize = 0;
status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
if (ERROR_INSUFFICIENT_BUFFER == status)
{
pInfo = (TRACE_EVENT_INFO*)malloc(BufferSize);
if (pInfo == NULL)
{
OutputDebugString("Failed to allocate memory for event info");
status = ERROR_OUTOFMEMORY;
return;
}
else
{
OutputDebugString("successful memory allocation");
}
// Retrieve the event metadata.
status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
}
if (ERROR_SUCCESS != status)
{
sprintf_s(msgbuf, "TdhGetEventInformation failed status[%d], buffersize[%d]", status, BufferSize);
OutputDebugString(msgbuf);
}
else
{
sprintf_s(msgbuf, "TdhGetEventInformation successful, buffersize[%d]", BufferSize);
OutputDebugString(msgbuf);
}
}
解决方案
推荐阅读
- python - 有没有办法解决由 Windows 文件名中的无效字符产生的这些转义序列?
- javascript - 迭代嵌套数组以同时从所有对象中获取相同的索引值
- javascript - 如何为画布转换延迟加载
- ruby-on-rails - 如何在Ruby on Rails中出现错误时回滚事务块中的所有事务
- amazon-sagemaker - sagemaker 中的模型输出文件夹
- r - 连接到 Linode 服务器(Ubuntu 16.04)上的 RStudio - 什么用户名和密码?
- https - Istio 网关无法通过 HTTPS 连接
- generics - 计算散列(digest::Digest trait)并取回字符串的通用函数
- python - 是否可以附加到函数内部的外部列表形式?
- apache-flink - Flink 检查点不断失败