private void MergeFiles(string kernelTraceFile, string userTraceFile, string traceFile)
        {
            var files = new List <string>();

            if (!File.Exists(kernelTraceFile))
            {
                Console.WriteLine("Kernel trace file not found.");
                Environment.Exit(1);
            }
            files.Add(kernelTraceFile);
            if (File.Exists(userTraceFile))
            {
                files.Add(userTraceFile);
            }

            logger.Log($"Merging {string.Join(',', files)}... ");
            try
            {
                TraceEventSession.Merge(files.ToArray(), traceFile);
            }
            catch (System.Runtime.InteropServices.COMException)
            {
                Console.WriteLine("Unable to merge the trace files due to insufficient system resources. Try freeing some memory.");
                Environment.Exit(1);
            }
            if (File.Exists(traceFile))
            {
                File.Delete(userTraceFile);
                File.Delete(kernelTraceFile);
            }
        }
            public Func <Dictionary <string, ETWHelper.CallTreeItem> > StopAndLazyMerge(bool leaveTraces)
            {
                bool rundown = !this.process.WaitForExit(500);

                StopCollection(collectionHandle, rundown: rundown);
                var pid = process.Id;

                return(() => {
                    var tmpFile = outFile + ".merged.etl";
                    if (File.Exists(tmpFile))
                    {
                        File.Delete(tmpFile);
                    }

                    var allFiles = GetAllResultFiles(outFile);
                    if (allFiles.Length > 1)
                    {
                        TraceEventSession.Merge(allFiles, tmpFile, TraceEventMergeOptions.Compress);
                        File.Delete(outFile);
                        File.Move(tmpFile, outFile);
                    }
                    else if (allFiles[0] != outFile)
                    {
                        File.Move(allFiles[0], outFile);
                    }
                    var(etlx, callTree) = TryGetCallTree(pid);

                    if (!leaveTraces)
                    {
                        if (File.Exists(etlx))
                        {
                            File.Delete(etlx);
                        }
                        File.Delete(outFile);
                        foreach (var f in Directory.GetFiles(Path.GetDirectoryName(outFile)))
                        {
                            if (Path.GetFileName(f).StartsWith(Path.GetFileNameWithoutExtension(outFile)))
                            {
                                File.Delete(f);
                            }
                        }
                    }
                    else if (rundown)
                    {
                        Directory.CreateDirectory(Path.Combine(Path.GetDirectoryName(outFile), "symbols"));
                        MergeAndZip(outFile);
                    }
                    else
                    {
                        Zip(outFile);
                    }
                    return callTree;
                });
            }
Exemple #3
0
        private void MergeFiles(string kernelTraceFile, string userTraceFile, string traceFile)
        {
            var files = new List <string>();

            if (!File.Exists(kernelTraceFile))
            {
                throw new FileNotFoundException("Kernel trace file not found.");
            }
            files.Add(kernelTraceFile);
            if (File.Exists(userTraceFile))
            {
                files.Add(userTraceFile);
            }

            logger.Log($"Merging {string.Join(',',files)}... ");
            TraceEventSession.Merge(files.ToArray(), traceFile);
            if (File.Exists(traceFile))
            {
                File.Delete(userTraceFile);
                File.Delete(kernelTraceFile);
            }
        }
Exemple #4
0
        public static void Stop(string sessionName)
        {
            Sessions sessions;

            if (s_sessions.TryRemove(sessionName, out sessions))
            {
                sessions.Close();

                var files = sessions.KernelFileName == sessions.UserFileName ? new[] { sessions.KernelFileName } : new[] { sessions.KernelFileName, sessions.UserFileName };

                TraceEventSession.Merge(files, sessions.MergedFileName, TraceEventMergeOptions.Compress);

                if (File.Exists(sessions.UserFileName))
                {
                    File.Delete(sessions.UserFileName);
                }
                if (File.Exists(sessions.KernelFileName))
                {
                    File.Delete(sessions.KernelFileName);
                }
            }
        }
Exemple #5
0
        private List <string> PrepForWrite()
        {
            // If the user did not specify a place to put log messages, make one for them.
            if (Log == null)
            {
                Log = new StringWriter();
            }

            Stopwatch sw = Stopwatch.StartNew();

            // Compute input & temp files.
            var dir = Path.GetDirectoryName(m_etlFilePath);

            if (dir.Length == 0)
            {
                dir = ".";
            }
            var           baseName    = Path.GetFileNameWithoutExtension(m_etlFilePath);
            List <string> mergeInputs = new List <string>();

            mergeInputs.Add(m_etlFilePath);
            mergeInputs.AddRange(Directory.GetFiles(dir, baseName + ".kernel*.etl"));
            mergeInputs.AddRange(Directory.GetFiles(dir, baseName + ".clr*.etl"));
            mergeInputs.AddRange(Directory.GetFiles(dir, baseName + ".user*.etl"));
            string        tempName    = Path.ChangeExtension(m_etlFilePath, ".etl.new");
            List <string> pdbFileList = null;

            try
            {
                // Do the merge and NGEN pdb lookup in parallel
                Task mergeWorker = Task.Factory.StartNew(delegate
                {
                    if (Merge)
                    {
                        var startTime = DateTime.UtcNow;
                        Log.WriteLine("Starting Merging of {0}", m_etlFilePath);

                        TraceEventMergeOptions options = TraceEventMergeOptions.None;
                        if (CompressETL)
                        {
                            options |= TraceEventMergeOptions.Compress;
                        }

                        // Do the merge
                        TraceEventSession.Merge(mergeInputs.ToArray(), tempName, options);
                        Log.WriteLine("Merging took {0:f1} sec", (DateTime.UtcNow - startTime).TotalSeconds);
                    }
                    else
                    {
                        Log.WriteLine("Merge == false, skipping Merge operation.");
                    }
                });

                Task pdbWorker = Task.Factory.StartNew(delegate
                {
                    if (NGenSymbolFiles)
                    {
                        var startTime = DateTime.UtcNow;
                        Log.WriteLine("Starting Generating NGEN pdbs for {0}", m_etlFilePath);
                        var symbolReader = SymbolReader;
                        if (symbolReader == null)
                        {
                            symbolReader = new SymbolReader(Log);
                        }
                        pdbFileList = GetNGenPdbs(m_etlFilePath, symbolReader, Log);
                        Log.WriteLine("Generating NGEN Pdbs took {0:f1} sec", (DateTime.UtcNow - startTime).TotalSeconds);
                    }
                    else
                    {
                        Log.WriteLine("NGenSymbolFiles == false, skipping NGEN pdb generation");
                    }
                });
                Task.WaitAll(mergeWorker, pdbWorker);

                if (File.Exists(tempName))
                {
                    // Delete/move the original files after the two worker threads finished execution to avoid races.
                    foreach (var mergeInput in mergeInputs)
                    {
                        FileUtilities.ForceDelete(mergeInput);
                    }

                    Log.WriteLine("Moving {0} to {1}", tempName, m_etlFilePath);
                    // Place the output in its final resting place.
                    FileUtilities.ForceMove(tempName, m_etlFilePath);
                }
            }
            finally
            {
                Log.WriteLine("Deleting temp file");
                if (File.Exists(tempName))
                {
                    File.Delete(tempName);
                }
            }

            sw.Stop();
            Log.WriteLine("Merge took {0:f3} sec.", sw.Elapsed.TotalSeconds);
            Log.WriteLine("Merge output file {0}", m_etlFilePath);

            return(pdbFileList);
        }