public void TraceNewProcess(IEnumerable <string> procargs, bool spawnNewConsoleWindow, TraceOptions traceOptions) { using (var process = new ProcessCreator(procargs) { SpawnNewConsoleWindow = spawnNewConsoleWindow }) { process.StartSuspended(); using (var kernelTraceCollector = new TraceCollector(KernelTraceEventParser.KernelSessionName)) using (var customTraceCollector = new TraceCollector(WinTraceUserTraceSessionName)) { InitializeProcessHandlers(kernelTraceCollector, customTraceCollector, process.ProcessId, traceOptions); ThreadPool.QueueUserWorkItem((o) => { process.Join(); StopCollectors(kernelTraceCollector, customTraceCollector); stopEvent.Set(); }); stopTraceCollectors = () => { StopCollectors(kernelTraceCollector, customTraceCollector); }; ThreadPool.QueueUserWorkItem((o) => { kernelTraceCollector.Start(); }); ThreadPool.QueueUserWorkItem((o) => { customTraceCollector.Start(); }); Thread.Sleep(1000); // resume thread process.Resume(); stopEvent.WaitOne(); } } }