2

TraceEvent ライブラリを使用してETW トレースをキャプチャしていますが、イベントを発生させたプロセスの名前を特定できません。

これが私がこれまでに持っているものです:

var session = new TraceEventSession(sessionName, null);
session.EnableProvider(MyEventSource.Log.Guid, TraceEventLevel.Informational,
    options: TraceEventOptions.Stacks);
Task.Delay(1000).ContinueWith(t => session.Stop()); // for testing, deal with it (⌐■_■)
var src = new ETWTraceEventSource(sessionName, TraceEventSourceType.Session);
TraceLog.CreateFromSource(src, etlxFile, null);
var log = TraceLog.OpenOrConvert(etlxFile);
var process = log.Events.First().ProcessName;
// breakpoint

最後のブレークポイントにヒットすると、process"". ProcessIDは適切な PID ですが、ログ内のプロセスから見つけた有用な情報はこれだけです。

プロセス名がログに記録されることを期待していました。何か間違ったことをしているのですか、それともこの API が私の OS (Windows 7) で利用できないのですか?

4

2 に答える 2

0

これは、カーネル プロバイダーを有効にしてから、プロセス ID からプロセス名へのルックアップを維持することで実行できます。大まかな例を次に示します。エラー チェックはありませんが、アイデアはわかります。

// create a lookup collection for future use    
var pidToProcessName = new Dictionary<int, string>();

var session = new TraceEventSession(...);
// enable the kernel provider - note!  this most come first
session.EnableKernelProvider(KernelTraceEventParser.Keywords.Process);
...
session.Source.Kernel.ProcessStart += ProcessStart;
session.Source.Dynamic.All += TraceEvent;
...
session.Source.Procces();    


void ProcessStart(ProcessTraceData obj)
{
    if(obj.OpCode == TraceEventOpcode.Start)
    {
        pidToProcessName[obj.ProcessID] = obj.ProcessName;
    }
}

void TraceEvent(TraceEvent obj)
{
    // pull the process name from our lookup
    var processNameOfEvent = pidToProcessName[obj.ProcessID];    
}
于 2020-04-21T19:18:07.873 に答える