- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试监听 ETW 内核事件。
第 1 步:调用 OpenTrace
,指定 EventCallback
和可选 BufferCallback
在我调用 ProcessTrace
期间将调用的函数:
var
logFile: EVENT_TRACE_LOGFILE;
currentTrace: TRACEHANDLE;
begin
ZeroMemory(@logFile, sizeof(logFile));
logFile.LoggerName := KERNEL_LOGGER_NAME;
logFile.LogFileName := 'C:\Users\Ian\foo.etl';
logFile.ProcessTraceMode := 0;
logFile.EventCallback := RealtimeEventCallback;
logFile.BufferCallback := BufferCallback; //optional
currentTrace := OpenTrace(@logFile);
if (currentTrace = INVALID_PROCESSTRACE_HANDLE) or (currentTrace = -1) then
RaiseLastWin32Error();
第 2 步:Enable kernel events 。这是通过调用StartTrace
来完成的。 。就我而言,我想跟踪内核 interrupts ( EVENT_TRACE_FLAG_INTERRUPT
) 和 deferred procedure calls (EVENT_TRACE_FLAG_DPC
):
var
sessionProperties: PEVENT_TRACE_PROPERTIES;
bufferSize: Int64;
th: TRACEHANDLE;
loggerName: string;
logFilePath: string;
begin
loggerName := KERNEL_LOGGER_NAME;
logFilePath := 'C:\Users\Ian\foo.etl';
bufferSize := sizeof(EVENT_TRACE_PROPERTIES)
+ 1024 //maximum session name is 1024 characters
+ 1024; //maximum log file name is 1024 characters
sessionProperties := AllocMem(bufferSize);
ZeroMemory(sessionProperties, bufferSize);
sessionProperties.Wnode.BufferSize := bufferSize;
sessionProperties.Wnode.ClientContext := 1; //QPC clock resolution
sessionProperties.Wnode.Flags := WNODE_FLAG_TRACED_GUID;
sessionProperties.Wnode.Guid := SystemTraceControlGuid;
sessionProperties.EnableFlags := EVENT_TRACE_FLAG_INTERRUPT or EVENT_TRACE_FLAG_DPC;
sessionProperties.LogFileMode := EVENT_TRACE_FILE_MODE_CIRCULAR;
sessionProperties.MaximumFileSize := 5; // 5 MB
sessionProperties.LoggerNameOffset := sizeof(EVENT_TRACE_PROPERTIES);
sessionProperties.LogFileNameOffset := sizeof(EVENT_TRACE_PROPERTIES)+1024;
//Copy LoggerName to the offset address
MoveMemory(Pointer(Cardinal(sessionProperties)+sessionProperties.LoggerNameOffset), PChar(loggerName), Length(loggerName)+1);
//Copy LogFilePath to the offset address
MoveMemory(Pointer(Cardinal(sessionProperties)+sessionProperties.LogFileNameOffset), PChar(logFilePath), Length(logFilePath)+1);
hr := StartTrace({var}th, PChar(loggerName), sessionProperties);
if (hr <> ERROR_SUCCESS) then
raise EWin32Error.Create(SysErrorMessage(hr));
日志已成功启动(我可以看到 foo.etl
开始增长到其 5 MB 循环限制)。
第 3 步:调用 ProcessTrace
,它会阻塞,直到将所有待处理事件传递到 EventCallback
步骤 1 中指定的处理程序:
var
res: LongWord;
begin
res := EventTrace.ProcessTrace(@currentTrace, 1, nil, nil);
if (res <> ERROR_SUCCESS) then
raise EWin32Error.Create(SysErrorMessage(res));
除了 ProcessTrace
立即重复返回,并且不会调用回调 - 即使 etl 文件存在并且正在增长。
如果我将日志记录从基于文件更改为实时日志记录:
第 1 步 - OpenTrace
进行更改以支持实时:
logFile.ProcessTraceMode := PROCESS_TRACE_MODE_REAL_TIME;
第 2 步 - StartTrace
进行更改以支持实时:
sessionProperties.LogFileMode := EVENT_TRACE_REAL_TIME_MODE;
在这种情况下,ProcessTrace
从不返回,但EventCallback
或BufferCallback
都没有返回曾经被调用过。
我做错了什么?
<小时/>更新:我的回调函数:
function BufferCallback(Logfile: PEVENT_TRACE_LOGFILE): LongWord; stdcall;
begin
ShowMessage('BufferCallback');
Result := 1; //return true to keep processing rows
end;
procedure RealtimeEventCallback(pEvent: PEVENT_TRACE); stdcall;
begin
ShowMessage('EventCallback');
nEvents := nEvents+1;
end;
最佳答案
我发现了问题。
我使用的标题不是四字对齐的。
用 Delphi 的说法,使用了关键字 packed
。
关于delphi - Windows ETW : Kernel consumer receives no EventCallback or BufferCallback events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9055772/
我目前正在使用 Microsoft 网络监视器来解析调试事件跟踪。它不是一个坏工具,但也不是很好。你知道一些更好的解决方案吗? 最佳答案 这些是用于探索自定义 ETW 跟踪的读者: SvcPerf -
我正在使用 Windows API 的事件跟踪,并且不时运行我的应用程序,但它在打开 ETW 跟踪 Controller session 后无法关闭它。 基本上我做::StartTrace([out]
问题:如何查看所有打开的 ETW session ,包括其根路径?我期望一些 PowerShell 命令,如 Get-EtwTraceSession ,但我没有看到任何内容。 背景 我使用 Event
性能计数器是 ETW 的一部分吗?如果不是,两者有什么区别? 最佳答案 性能计数器和 ETW 是不同的技术。性能计数器不通过 ETW 公开。 基本区别:性能计数器提供有关系统行为的高级度量(想想计时器
我正在使用新的 EventSource 类从我的应用程序写入 Windows 事件日志,到目前为止它很棒。但是,我观察到有两件事会导致可能相关的问题:传递给 Event 属性的格式字符串在写入事件日志
我打算使用 ETW,因为它: 强制构建日志记录 低延迟 在另一个进程上消费事件的能力 想法是使用语义日志应用程序 block 等外部进程使用 ETW 事件,并将这些事件转发到中央位置。 我的问题是。如
我有一个使用 native 插件的应用程序。对于这些插件,我有自己的二进制格式。每个插件都在运行时使用类似于将 DLL 映射到进程空间的方法加载。这意味着,每个插件都有自己的 ImageBase,.t
我们使用 AppFabric Monitoring 来检查执行时间并跟踪日志消息。这在一年后运行良好,但一些服务器突然停止监视我们的 WCF 服务。 我在 AppFabric 监控方面有一些经验,并且
我为 CLR 提供程序记录 ETW 事件: xperf -start clr -on e13c0d23-ccbc-4e12-931b-d9cc2eee27e4 -f clr.etl ... xperf
是否有使用 ETW 记录异常的标准方法? 据我所知,这样做的唯一方法是记录消息和可能的内部异常消息,因为异常类型没有强类型参数。 最佳答案 启用时,所有 CLR 异常(第一次机会,以及可能最终导致应用
我正在尝试让我的 Azure 辅助角色的日志出现在 Application Insights 中。当我运行 Get-AzureServiceDiagnosticsExtension 时,我得到以下信息
如何确定 ETW session 是否正在丢弃事件? 如果正在丢弃事件,我如何配置跟踪 session 以便事件不被丢弃? 我编写了一个自定义 ETW 提供程序来帮助进行一些调试工作。我目前正在使用
任务并行库使用 Event Tracing for Windows (ETW)用于记录。显然,在 Windows Phone 或 Windows Store .NET Runtime 下,TPL 或
我想实现一个 ETW C 中的消费者用于来自 Microsoft-Windows-TCPIP 提供程序的事件。但是,我找不到此提供程序生成的事件类型。 我已经做了一些类似的工作来使用来自 Micros
这个问题在这里已经有了答案: How do I log events in Windows IoT? (1 个回答) 关闭 5 年前。 我正在为 Windows 10 IoT 开发基于 UWP 的应
一些人告诉我,ETW 提供了一种机制来捕获用户模式进程进行的系统调用。我已经列举了可用的提供者,并且只提出了两个可能提供此信息的可能性。第一个是 Microsoft-Windows-Kernel-Au
在不使用 list 的情况下卸载/删除以前安装的事件源的最佳方法是什么? 例如。如果我有类似的东西: [EventSource(Name = "Corporation-Module-X")]
我正在尝试使用新的 EventSource(来自 nuget 的 Microsoft.Diagnostics.Tracing.EventSource)及其对 ETW channel 的新支持,以便写入
我们刚刚开始使用 Service Fabric,到目前为止唯一的痛点是使用 WAD 进行 ETW,它似乎总是因丢失数据(消息、事件消息)而注销。 到目前为止,我们的经验是它在 Visual Studi
我们刚刚开始使用 Service Fabric,到目前为止唯一的痛点是使用 WAD 进行 ETW,它似乎总是因丢失数据(消息、事件消息)而注销。 到目前为止,我们的经验是它在 Visual Studi
我是一名优秀的程序员,十分优秀!