From ce1443bcc6f770edc8bd6f2a4bdd793ccd864c49 Mon Sep 17 00:00:00 2001 From: Chris Gray Date: Tue, 10 Aug 2021 18:47:31 -0700 Subject: [PATCH 1/2] improve string decomp helpers --- src/clog/TraceEmitterModules/CLogSTDOUT.cs | 2 +- src/clog2text/clog2text_windows/Program.cs | 2 +- src/clogutils/CLogConsoleTrace.cs | 4 +- src/clogutils/CLogDecodedTraceLine.cs | 7 +- src/clogutils/CLogEncodingCLogTypeSearch.cs | 3 +- src/clogutils/CLogFileProcessor.cs | 94 +++++++++++++++++-- src/clogutils/CLogFullyDecodedMacroEmitter.cs | 8 +- 7 files changed, 100 insertions(+), 20 deletions(-) diff --git a/src/clog/TraceEmitterModules/CLogSTDOUT.cs b/src/clog/TraceEmitterModules/CLogSTDOUT.cs index 2b3b35b..b08cc08 100644 --- a/src/clog/TraceEmitterModules/CLogSTDOUT.cs +++ b/src/clog/TraceEmitterModules/CLogSTDOUT.cs @@ -58,7 +58,7 @@ public void FinishedProcessing(CLogOutputInfo outputInfo, StringBuilder header, bool emittedHeader = false; public void TraceLineDiscovered(string sourceFile, CLogOutputInfo outputInfo, CLogDecodedTraceLine decodedTraceLine, CLogSidecar sidecar, StringBuilder macroPrefix, StringBuilder inline, StringBuilder function) { - string clean; + CLogFileProcessor.DecomposedString clean; CLogFileProcessor.CLogTypeContainer[] types = CLogFileProcessor.BuildTypes(decodedTraceLine.configFile, null, decodedTraceLine.TraceString, null, out clean); CLogExportModuleDefination moduleSettings = decodedTraceLine.GetMacroConfigurationProfile().FindExportModule(ModuleName); diff --git a/src/clog2text/clog2text_windows/Program.cs b/src/clog2text/clog2text_windows/Program.cs index 4c83ab7..cbddb5b 100644 --- a/src/clog2text/clog2text_windows/Program.cs +++ b/src/clog2text/clog2text_windows/Program.cs @@ -155,7 +155,7 @@ private static int Main(string[] cmdLineArgs) argMap = sidecar.GetTracelineMetadata(bundle, "MANIFESTED_ETW"); } - var types = CLogFileProcessor.BuildTypes(sidecar.ConfigFile, null, bundle.TraceString, null, out string clean); + var types = CLogFileProcessor.BuildTypes(sidecar.ConfigFile, null, bundle.TraceString, null, out CLogFileProcessor.DecomposedString clean); if (0 == types.Length) { diff --git a/src/clogutils/CLogConsoleTrace.cs b/src/clogutils/CLogConsoleTrace.cs index e4a5678..dea4bed 100644 --- a/src/clogutils/CLogConsoleTrace.cs +++ b/src/clogutils/CLogConsoleTrace.cs @@ -128,9 +128,9 @@ public static void DecodeAndTraceToConsole(StreamWriter outputfile, CLogDecodedT } } - string clean; + CLogFileProcessor.DecomposedString decompString; - CLogFileProcessor.CLogTypeContainer[] types = CLogFileProcessor.BuildTypes(config, null, bundle.TraceString, null, out clean); + CLogFileProcessor.CLogTypeContainer[] types = CLogFileProcessor.BuildTypes(config, null, bundle.TraceString, null, out decompString); if (0 == types.Length) { diff --git a/src/clogutils/CLogDecodedTraceLine.cs b/src/clogutils/CLogDecodedTraceLine.cs index e9242e1..9467554 100644 --- a/src/clogutils/CLogDecodedTraceLine.cs +++ b/src/clogutils/CLogDecodedTraceLine.cs @@ -25,7 +25,7 @@ public class CLogDecodedTraceLine [JsonProperty] public Dictionary> ModuleProperites = new Dictionary>(); public CLogDecodedTraceLine(string uniqueId, string sourceFile, string userString, string userStringNoPrefix, CLogLineMatch m, CLogConfigurationFile c, - CLogTraceMacroDefination mac, CLogFileProcessor.CLogVariableBundle[] args, string cleanedString) + CLogTraceMacroDefination mac, CLogFileProcessor.CLogVariableBundle[] args, CLogFileProcessor.DecomposedString decompString) { SourceFile = sourceFile; macro = mac; @@ -35,13 +35,14 @@ public CLogDecodedTraceLine(string uniqueId, string sourceFile, string userStrin TraceString = userString; splitArgs = args; TraceStringNoPrefix = userStringNoPrefix; - CleanedString = cleanedString; + DecomposedString = decompString; } [JsonProperty] public string TraceString { get; private set; } - public string CleanedString { get; private set; } + public CLogFileProcessor.DecomposedString DecomposedString; + public string CleanedString { get { return DecomposedString.AsManifestedETWEncoding; } } public string TraceStringNoPrefix { get; private set; } diff --git a/src/clogutils/CLogEncodingCLogTypeSearch.cs b/src/clogutils/CLogEncodingCLogTypeSearch.cs index a112a3b..d3c8636 100644 --- a/src/clogutils/CLogEncodingCLogTypeSearch.cs +++ b/src/clogutils/CLogEncodingCLogTypeSearch.cs @@ -37,8 +37,7 @@ public class CLogEncodingCLogTypeSearch public bool IsEncodableArg { - get - { + get { return !Synthesized && (EncodingType != CLogEncodingType.UniqueAndDurableIdentifier && EncodingType != CLogEncodingType.UserEncodingString); diff --git a/src/clogutils/CLogFileProcessor.cs b/src/clogutils/CLogFileProcessor.cs index 79d89e5..8a31e7d 100644 --- a/src/clogutils/CLogFileProcessor.cs +++ b/src/clogutils/CLogFileProcessor.cs @@ -171,16 +171,90 @@ private static string[] SplitWithEscapedQuotes(string info, char splitChar) return ret.ToArray(); } + + public class DecomposedString + { + public void AddEncoding(EncodingArg arg) + { + encodings.Add(arg); + } + + public EncodingArg CreateNewArg() + { + EncodingArg arg = new EncodingArg(); + encodings.Add(arg); + return arg; + } + public class EncodingArg + { + public string Prefix { get; set; } = ""; + public CLogEncodingCLogTypeSearch Type { get; set; } + } + + public string AsPrintF + { + get + { + string ret = ""; + int idx = 0; + foreach (var e in encodings) + { + if (null != e.Type) + { + switch(e.Type.EncodingType) + { + case CLogEncodingType.ByteArray: + ret += "p"; + break; + default: + ret += e.Type.DefinationEncoding; + break; + } + + ++idx; + } + ret += e.Prefix; + } + + return ret; + } + } + public string AsManifestedETWEncoding { + get { + string ret = ""; + int idx = 0; + foreach(var e in encodings) + { + if(null != e.Type) + { + //ret += e.Type.DefinationEncoding; + ret += idx; + ++idx; + } + ret += e.Prefix; + } + + return ret; + } + } + + private List encodings = new List(); + } + public static CLogTypeContainer[] BuildTypes(CLogConfigurationFile configFile, CLogLineMatch traceLineMatch, string argString, string traceLine, - out string cleanedString) + out DecomposedString decompString) { List ret = new List(); string pieces = string.Empty; int argCount = 0; - cleanedString = string.Empty; + + decompString = new DecomposedString(); + string prefixString = ""; + DecomposedString.EncodingArg currentArg = decompString.CreateNewArg(); + if (string.IsNullOrEmpty(argString)) { return new CLogTypeContainer[0]; @@ -192,6 +266,7 @@ public static CLogTypeContainer[] BuildTypes(CLogConfigurationFile configFile, C for (int i = 0; i < argString.Length; ++i) { pieces += argString[i]; + currentArg.Prefix += argString[i]; if ('%' == argString[i]) { @@ -201,6 +276,8 @@ public static CLogTypeContainer[] BuildTypes(CLogConfigurationFile configFile, C newNode.LeadingString = prefixString; newNode.ArgStartingIndex = i; + currentArg = decompString.CreateNewArg(); + ++i; // Check to see if a custom name is specified for this type @@ -245,6 +322,7 @@ public static CLogTypeContainer[] BuildTypes(CLogConfigurationFile configFile, C { // 'i' will point to the final character on a match (such that i+1 is the next fresh character) t = configFile.FindTypeAndAdvance(argString, traceLineMatch, ref i); + } catch (CLogTypeNotFoundException) { @@ -253,6 +331,7 @@ public static CLogTypeContainer[] BuildTypes(CLogConfigurationFile configFile, C newNode.TypeNode = t; newNode.ArgLength = i - newNode.ArgStartingIndex + 1; + currentArg.Type = t; // If we found a preferred name, the next character after the type should be a closing brace if (preferredName.Length != 0) @@ -276,7 +355,9 @@ public static CLogTypeContainer[] BuildTypes(CLogConfigurationFile configFile, C } } - cleanedString = pieces; + if (!pieces.Equals(decompString.AsManifestedETWEncoding)) + throw new Exception("ETW strings dont match"); + return ret.ToArray(); } @@ -300,12 +381,13 @@ private static CLogDecodedTraceLine BuildArgsFromEncodedArgsX(CLogConfigurationF CLogTraceMacroDefination macroDefination, CLogLineMatch traceLineMatch, string traceLine) { string userArgs = macroDefination.CombinePrefixWithEncodedString(traceLineMatch.EncodingString); - string cleanedString; + CLogFileProcessor.DecomposedString decompString; + // // Loop across all types, ignoring the ones that are not specified in the source code // Queue types = new Queue(); - foreach (var type in BuildTypes(configFile, traceLineMatch, userArgs, traceLine, out cleanedString)) + foreach (var type in BuildTypes(configFile, traceLineMatch, userArgs, traceLine, out decompString)) { if (type.TypeNode.Synthesized) { @@ -404,7 +486,7 @@ private static CLogDecodedTraceLine BuildArgsFromEncodedArgsX(CLogConfigurationF throw new CLogEnterReadOnlyModeException("InvalidUniqueID", CLogHandledException.ExceptionType.InvalidUniqueId, traceLineMatch); } - CLogDecodedTraceLine decodedTraceLine = new CLogDecodedTraceLine(traceLineMatch.UniqueID, sourcefile, userArgs, traceLineMatch.EncodingString, traceLineMatch, configFile, macroDefination, finalArgs.ToArray(), cleanedString); + CLogDecodedTraceLine decodedTraceLine = new CLogDecodedTraceLine(traceLineMatch.UniqueID, sourcefile, userArgs, traceLineMatch.EncodingString, traceLineMatch, configFile, macroDefination, finalArgs.ToArray(), decompString); return decodedTraceLine; } diff --git a/src/clogutils/CLogFullyDecodedMacroEmitter.cs b/src/clogutils/CLogFullyDecodedMacroEmitter.cs index 59d9f24..c7a8a25 100644 --- a/src/clogutils/CLogFullyDecodedMacroEmitter.cs +++ b/src/clogutils/CLogFullyDecodedMacroEmitter.cs @@ -133,7 +133,7 @@ public void TraceLineDiscovered(CLogDecodedTraceLine decodedTraceLine, CLogOutpu string implSignature = $" clogTraceImpl_{clogArgCountForMacroAlignment}_ARGS_TRACE_{decodedTraceLine.UniqueId}("; string macroName = $"_clog_{clogArgCountForMacroAlignment}_ARGS_TRACE_{decodedTraceLine.UniqueId}"; - _headerFile.AppendLine($"#ifndef {macroName}"); + if (-1 != decodedTraceLine.macro.EncodedArgNumber) { @@ -199,9 +199,6 @@ public void TraceLineDiscovered(CLogDecodedTraceLine decodedTraceLine, CLogOutpu StringBuilder macroBody = new StringBuilder(); - _headerFile.AppendLine(""); - _headerFile.AppendLine(""); - _headerFile.AppendLine(""); _headerFile.AppendLine("/*----------------------------------------------------------"); _headerFile.AppendLine($"// Decoder Ring for {decodedTraceLine.UniqueId}"); _headerFile.AppendLine($"// {decodedTraceLine.TraceString}"); @@ -216,6 +213,7 @@ public void TraceLineDiscovered(CLogDecodedTraceLine decodedTraceLine, CLogOutpu } _headerFile.AppendLine("----------------------------------------------------------*/"); + _headerFile.AppendLine($"#ifndef {macroName}"); // // BUGBUG: not fully implemented - the intent of 'implSignature' is to give a turn key @@ -281,7 +279,7 @@ public void TraceLineDiscovered(CLogDecodedTraceLine decodedTraceLine, CLogOutpu CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Err, " typo in a trace string) - have two options to override/refresh the signature check"); CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Std, ""); CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Std, " Force/Clobber the event signature - indicating you desire breaking the uniqueness contract"); - CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Std, $" 1. remove UniquenessHash ({existingTraceInfo.UniquenessHash}) frome this TraceID({existingTraceInfo.TraceID}) in file {decodedTraceLine.configFile.FilePath}"); + CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Std, $" 1. remove UniquenessHash ({existingTraceInfo.UniquenessHash}) from this TraceID({existingTraceInfo.TraceID}) in file {decodedTraceLine.configFile.FilePath}"); CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Std, $" 2. specify the --overwriteHashCollisions command line argument (good if you're making lots of changes that are all safe)"); CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Tip, $" 3. set the environment variable CLOG_DEVELOPMENT_MODE=1 ($env:CLOG_DEVELOPMENT_MODE=1)"); CLogConsoleTrace.TraceLine(CLogConsoleTrace.TraceType.Std, ""); From d8937d4b51e307ff95659c73c74f25c6348287ce Mon Sep 17 00:00:00 2001 From: Chris Gray Date: Tue, 10 Aug 2021 18:52:14 -0700 Subject: [PATCH 2/2] improve string decomp helpers --- src/clog/TraceEmitterModules/CLogSTDOUT.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/clog/TraceEmitterModules/CLogSTDOUT.cs b/src/clog/TraceEmitterModules/CLogSTDOUT.cs index b08cc08..bd61b2f 100644 --- a/src/clog/TraceEmitterModules/CLogSTDOUT.cs +++ b/src/clog/TraceEmitterModules/CLogSTDOUT.cs @@ -59,7 +59,6 @@ public void FinishedProcessing(CLogOutputInfo outputInfo, StringBuilder header, public void TraceLineDiscovered(string sourceFile, CLogOutputInfo outputInfo, CLogDecodedTraceLine decodedTraceLine, CLogSidecar sidecar, StringBuilder macroPrefix, StringBuilder inline, StringBuilder function) { CLogFileProcessor.DecomposedString clean; - CLogFileProcessor.CLogTypeContainer[] types = CLogFileProcessor.BuildTypes(decodedTraceLine.configFile, null, decodedTraceLine.TraceString, null, out clean); CLogExportModuleDefination moduleSettings = decodedTraceLine.GetMacroConfigurationProfile().FindExportModule(ModuleName);