Esempio n. 1
0
        /// <summary>
        /// Tries to parse a StackFrame following convention from Environment.StackTrace
        /// https://docs.microsoft.com/en-us/dotnet/api/system.environment.stacktrace has
        /// details on output format and expected strings
        ///
        /// Example:
        /// at ConsoleApp4.MyClass.M() in C:\repos\ConsoleApp4\ConsoleApp4\Program.cs:line 26
        /// </summary>
        public bool TryParseLine(string line, [NotNullWhen(true)] out ParsedFrame?parsedFrame)
        {
            parsedFrame = null;

            if (!line.Trim().StartsWith(StackTraceAtStart))
            {
                return(false);
            }

            var success = StackFrameParserHelpers.TryParseMethodSignature(line.AsSpan(), out var classSpan, out var methodSpan, out var argsSpan);

            if (!success)
            {
                return(false);
            }

            var splitIndex = line.IndexOf(StackTraceSymbolAndFileSplit);

            // The line has " in <filename>:line <line number>"
            if (splitIndex > 0)
            {
                var fileInformationStart = splitIndex + StackTraceSymbolAndFileSplit.Length;
                var fileInformationSpan  = new TextSpan(fileInformationStart, line.Length - fileInformationStart);

                parsedFrame = new ParsedStackFrame(line, classSpan, methodSpan, argsSpan, fileInformationSpan);
                return(true);
            }

            parsedFrame = new ParsedStackFrame(line, classSpan, methodSpan, argsSpan);
            return(true);
        }
Esempio n. 2
0
        public bool TryParseLine(string line, [NotNullWhen(true)] out ParsedFrame?parsedFrame)
        {
            // Example line:
            // ConsoleApp4.dll!ConsoleApp4.MyClass.ThrowAtOne() Line 19	C#
            //                |--------------------------------|
            //                     Symbol data we care about
            parsedFrame = null;

            // +1 here because we always want to skip the '!' character
            var startPoint = line.IndexOf('!') + 1;

            if (startPoint == 0 || startPoint == line.Length)
            {
                return(false);
            }

            var success = StackFrameParserHelpers.TryParseMethodSignature(line.AsSpan().Slice(startPoint), out var classSpan, out var methodSpan, out var argsSpan);

            if (!success)
            {
                return(false);
            }

            // The spans need to be fixed up by the start point since we didn't
            // pass everyting from '!' and before to the parser
            classSpan  = new TextSpan(classSpan.Start + startPoint, classSpan.Length);
            methodSpan = new TextSpan(methodSpan.Start + startPoint, methodSpan.Length);
            argsSpan   = new TextSpan(argsSpan.Start + startPoint, argsSpan.Length);

            parsedFrame = new ParsedStackFrame(line, classSpan, methodSpan, argsSpan);
            return(true);
        }