public void HandleMethodExit_ValidLog_ExpectedTextIsReturned()
        {
            // Arrange
            var filters      = this.GetDefaultFilters();
            var output       = new ThreadCollectionOutputHandler(filters);
            var entry        = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var expectedText = String.Concat("".PadLeft(2, output.Formatter.IndentChar), "[Exit] Yalf.TestMethod(returnVal) duration 345ms");

            int threadId   = 22;
            var threadData = new ThreadData(threadId, "cotton", null);

            output.Initialise();
            output.HandleThread(threadData);

            // Act
            output.HandleMethodExit(entry, 1, true);
            output.Complete();

            // Assert
            var outputText = output.GetThreadEntries();

            Assert.That(outputText.Count, Is.EqualTo(1), "Expected one thread collection");
            Assert.That(outputText[threadId].Count, Is.EqualTo(1), "Expected the thread to have one log entry");
            Assert.That(outputText[threadId][0], Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
        public void HandleThread_ValidLogWithBlankThreadName_ExpectedTextIsReturned()
        {
            // Arrange
            var filters = this.GetDefaultFilters();
            var output  = new ThreadCollectionOutputHandler(filters);

            var entry1 = new MethodEntry(1, "Yalf.TestMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));
            var entry2 = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");

            int threadId = 22;
            var entry    = new ThreadData(threadId, String.Empty, new BaseEntry[] { entry1, entry2 });

            output.Initialise();


            // Act
            output.HandleThread(entry);
            output.Complete();

            // Assert
            Assert.That(output.CurrentThreadId, Is.EqualTo(threadId), "Not the expected thread id for the current thread.");

            var outputText = output.GetThreadEntries();

            Assert.That(outputText.Count, Is.EqualTo(1), "Expected one thread collection");
            Assert.That(outputText[threadId].Count, Is.EqualTo(0), "Expected the thread to have no log entries");
        }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy) data.GetByte();
            var count = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var eventKind = (Jdwp.EventKind) data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                    case Jdwp.EventKind.VmInit:
                        evt = new VmStart(data);
                        break;
                    case Jdwp.EventKind.SingleStep:
                        evt = new SingleStep(data);
                        break;
                    case Jdwp.EventKind.BreakPoint:
                        evt = new Breakpoint(data);
                        break;
                    case Jdwp.EventKind.MethodEntry:
                        evt = new MethodEntry(data);
                        break;
                    case Jdwp.EventKind.MethodExit:
                        evt = new MethodExit(data);
                        break;
                    case Jdwp.EventKind.Exception:
                        evt = new Exception(data);
                        break;
                    case Jdwp.EventKind.ThreadStart:
                        evt = new ThreadStart(data);
                        break;
                    case Jdwp.EventKind.ThreadEnd:
                        evt = new ThreadDeath(data);
                        break;
                    case Jdwp.EventKind.ClassPrepare:
                        evt = new ClassPrepare(data);
                        break;
                    case Jdwp.EventKind.ClassUnload:
                        evt = new ClassUnload(data);
                        break;
                    case Jdwp.EventKind.FieldAccess:
                        evt = new FieldAccess(data);
                        break;
                    case Jdwp.EventKind.FieldModification:
                        evt = new FieldModification(data);
                        break;
                    case Jdwp.EventKind.VmDeath:
                        evt = new VmDeath(data);
                        break;
                    default:
                        throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                });
            }
        }
Exemple #4
0
        public void HandleThread_ValidLogWithBlankThreadName_ExpectedTextIsReturned()
        {
            // Arrange
            var filters = this.GetDefaultFilters();
            var output  = new DefaultOutputHandler(filters);

            var entry1 = new MethodEntry(1, "Yalf.TestMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));
            var entry2 = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var entry  = new ThreadData(22, String.Empty, new BaseEntry[] { entry1, entry2 });

            var expectedText = String.Concat("[Thread 22]");

            output.Initialise();

            // Act
            output.HandleThread(entry);
            output.Complete();

            // Assert
            var outputText = output.GetReport();

            Assert.That(outputText, Is.Not.Empty, "Expected a string to be returned");
            Assert.That(output.CurrentThreadId, Is.EqualTo(22), "Not the expected thread id for the current thread.");
            Assert.That(outputText, Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
        public void HandleMethodExit_LogNotEnabled_NoTextIsReturned()
        {
            // Arrange
            var filters = this.GetDefaultFilters();
            var output  = new ThreadCollectionOutputHandler(filters);
            var entry   = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");

            output.Initialise();

            int threadId   = 22;
            var threadData = new ThreadData(threadId, "cotton", null);

            output.Initialise();
            output.HandleThread(threadData);

            // Act
            output.HandleMethodExit(entry, 1, false);
            output.Complete();

            // Assert
            var outputText = output.GetThreadEntries();

            Assert.That(outputText.Count, Is.EqualTo(1), "Expected one thread collection");
            Assert.That(outputText[threadId].Count, Is.EqualTo(0), "Expected the thread to have no log entries");
        }
Exemple #6
0
        private static string PrintMethodExit(MethodExit entry, int level)
        {
            var returnValue = entry.ReturnRecorded ? "(" + entry.ReturnValue + ")" : "";
            var str         = string.Format("[Exit] {0}{1} duration {2:0.####}ms", entry.MethodName, returnValue, entry.ElapsedMs);

            return(Indent(level) + str + Environment.NewLine);
        }
Exemple #7
0
        public void FormatMethodExit_CallMade_ExceptionIsThrown()
        {
            // Arrange
            var filters   = this.GetDefaultFilters();
            var formatter = new SingleLineFormatter();
            var entry     = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");

            // Act, Assert
            var outputText = formatter.FormatMethodExit(1, 2, 33, entry, filters, true);
        }
Exemple #8
0
        public void FormatMethodExit_SuppliedEntryMethodNameDoesNotMatch_ExceptionIsThrown()
        {
            // Arrange
            var filters   = this.GetDefaultFilters();
            var formatter = new DelimitedValuesFormatter();
            var entry     = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");

            // Act, Assert
            var outputText = formatter.FormatMethodExitForSingleLineOutput(1, 2, 33, entry, filters, true);
        }
        public void HandleMethodExit(MethodExit entry, int indentLevel, bool displayEnabled)
        {
            if (this.Formatter is ISingleLineOutputLogFormatter)
            {
                this.ManageNestedCallsForSingleLineFormats(entry, indentLevel, displayEnabled);
                return;
            }

            this.AddLine(this.Formatter.FormatMethodExit(this.CurrentThreadId, indentLevel, ++_lineNumber, entry, this.Filters, displayEnabled), indentLevel);
        }
Exemple #10
0
        public void MethodExit_Rountrip()
        {
            // arrange
            var entry = new MethodExit(2, "method", 11, true, "value");

            // act
            var deserialized = SerializationRoundtrip(entry);

            // assert
            Assert.IsNotNull(deserialized);
        }
        private Func <DateTime, string> CreateMethodExitLineGenerator(MethodExit logEntry, ILogFilters filters)
        {
            var returnValue = (logEntry.ReturnRecorded && !filters.HideMethodReturnValue) ? "(" + logEntry.ReturnValue + ")" : "()";
            var duration    = (filters.HideMethodDuration) ? "" : string.Format(" duration {0:0.####}ms", logEntry.ElapsedMs);

            return(startTime =>
            {
                var timestamp = (filters.HideTimeStampInMethod) ? "" : string.Concat(" started ", (startTime.ToString(DateTimeFormat)));
                return String.Concat(logEntry.MethodName, returnValue, timestamp, duration);
            });
        }
        private void ManageNestedCallsForSingleLineFormats(MethodExit entry, int indentLevel, bool displayEnabled)
        {
            var output = (this.Formatter as ISingleLineOutputLogFormatter).FormatMethodExitForSingleLineOutput(this.CurrentThreadId, indentLevel, ++_lineNumber, entry, this.Filters, displayEnabled);

            if (output == null)
            {
                return;
            }

            foreach (OrderedOutput outputLine in output)
            {
                this.AddLine(outputLine.FormattedLine, indentLevel + outputLine.Level);
            }
        }
Exemple #13
0
        public void FormatMethodExit_NoEntryMethodSupplied_ExceptionIsThrown()
        {
            // Arrange
            var filters   = this.GetDefaultFilters();
            var formatter = new DelimitedValuesFormatter();
            var entry     = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");

            var relatedEntry = new MethodEntry(1, "Yalf.DifferentMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));

            formatter.FormatMethodEntry(1, 2, 33, relatedEntry, filters, true);

            // Act, Assert
            var outputText = formatter.FormatMethodExitForSingleLineOutput(1, 2, 33, entry, filters, true);
        }
Exemple #14
0
        public void FormatMethodExit_ReturnRecordedIsFalse_ExpectedTextIsReturned()
        {
            // Arrange
            var filters      = this.GetDefaultFilters();
            var formatter    = new DefaultFormatter();
            var entry        = new MethodExit(1, "Yalf.TestMethod", 345, false, "returnVal");
            var expectedText = "[Exit] Yalf.TestMethod() duration 345ms";

            // Act
            var outputText = formatter.FormatMethodExit(22, 1, 33, entry, filters, true);

            // Assert
            Assert.That(outputText, Is.Not.Empty, "Expected a string to be returned");
            Assert.That(outputText, Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
Exemple #15
0
        public void FormatMethodExit_HideMethodReturnValueIsSet_ExpectedTextIsReturned()
        {
            // Arrange
            var filters      = LogFiltersBuilder.Create().WithMethodReturnValueHidden().Build();
            var formatter    = new DefaultFormatter();
            var entry        = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var expectedText = "[Exit] Yalf.TestMethod() duration 345ms";

            // Act
            var outputText = formatter.FormatMethodExit(22, 1, 33, entry, filters, true);

            // Assert
            Assert.That(outputText, Is.Not.Empty, "Expected a string to be returned");
            Assert.That(outputText, Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
Exemple #16
0
        public string FormatMethodExit(int threadId, int level, int lineNo, MethodExit logEntry, ILogFilters filters, bool displayEnabled)
        {
            if ((filters.HideExitMethodLogs) || (!displayEnabled))
            {
                return(null);
            }

            var returnValue = (logEntry.ReturnRecorded && !filters.HideMethodReturnValue) ? "(" + logEntry.ReturnValue + ")" : "()";

            if (filters.HideMethodDuration)
            {
                return(string.Format("[Exit] {0}{1}", logEntry.MethodName, returnValue));
            }

            return(string.Format("[Exit] {0}{1} duration {2:0.####}ms", logEntry.MethodName, returnValue, logEntry.ElapsedMs));
        }
Exemple #17
0
        public void FormatThread_ValidLog_NullIsReturned()
        {
            // Arrange
            var filters   = this.GetDefaultFilters();
            var formatter = new DelimitedValuesFormatter();

            var entry1 = new MethodEntry(1, "Yalf.TestMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));
            var entry2 = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var entry  = new ThreadData(22, String.Empty, new BaseEntry[] { entry1, entry2 });

            // Act
            var outputText = formatter.FormatThread(entry, filters);

            // Assert
            Assert.That(outputText, Is.Null, "Did not expect any formatted text back for a delimited values formatter, threadid is in each row.");
        }
Exemple #18
0
        private void MethodExit(object value, bool recorded)
        {
            var stackEntry = _methodStack.Pop();
            var duration   = stackEntry.StopAndGetDuration();

            string returnValue = null;

            if (EnableReturnValueLogging && recorded && value != null)
            {
                returnValue = FormatValue(value);
            }

            var entry = new MethodExit(_methodStack.Count, stackEntry.MethodName, duration, recorded, returnValue);

            Record(entry);
        }
Exemple #19
0
        public IList <OrderedOutput> HandleMethodExit(MethodExit logEntry, int lineNo, ILogFilters filters, Func <DateTime, string> lineBuilder, bool displayEnabled)
        {
            if (!displayEnabled)
            {
                // method is not actually displayed, we are tracking the nesting level for other items displayed such as logs, exceptions, etc
                _currentNestedLevel--;
                return(null);
            }


            if ((_lastMethodEntry == null) || (_lastMethodEntry.Count <= 0))
            {
                throw new InvalidOperationException(String.Format("No related Method Entry log has been set for '{0}' at line {1:0000} - there could be a problem with the yalf logs."
                                                                  , logEntry.MethodName, lineNo));
            }
            if (_lastMethodEntry.Peek().MethodName != logEntry.MethodName)
            {
                throw new InvalidOperationException(String.Format("The method exit log '{1}' has a different name than the current method entry log '{0}' at line {2:0000} - there could be a problem with the yalf logs."
                                                                  , _lastMethodEntry.Peek().MethodName, logEntry.MethodName, lineNo));
            }

            var currentMethodEntry = _lastMethodEntry.Pop();

            _currentNestedLevel--;

            int indexOfEntryToUpdate = FindLastIndexOf(currentMethodEntry);

            if (indexOfEntryToUpdate < 0)
            {
                throw new InvalidOperationException(String.Format("Could not find the method [{0}] in the current ordered buffer.  This probably means there is an error in the processing logic, or the yalf file is corrupt.",
                                                                  currentMethodEntry.MethodName));
            }

            var currentItem = _orderedBuffer[indexOfEntryToUpdate];

            _orderedBuffer[indexOfEntryToUpdate] = new LogEntryTracker(currentItem.Level, currentItem.RelatedEntry, lineBuilder(currentMethodEntry.Time));

            if (_lastMethodEntry.Count > 0)
            {
                return(null);
            }

            _currentNestedLevel = 0;
            return(this.PrepareOutputBuffer());
        }
Exemple #20
0
        public void HandleMethodExit_LogNotEnabled_NoTextIsReturned()
        {
            // Arrange
            var filters = this.GetDefaultFilters();
            var output  = new DefaultOutputHandler(filters);
            var entry   = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");

            output.Initialise();

            // Act
            output.HandleMethodExit(entry, 1, false);
            output.Complete();

            // Assert
            var outputText = output.GetReport();

            Assert.That(outputText, Is.Empty, "Expected no text in the report output");
        }
Exemple #21
0
        public void FormatThread_ValidLogWithBlankThreadName_ExpectedTextIsReturned()
        {
            // Arrange
            var filters   = this.GetDefaultFilters();
            var formatter = new DefaultFormatter();

            var entry1 = new MethodEntry(1, "Yalf.TestMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));
            var entry2 = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var entry  = new ThreadData(22, String.Empty, new BaseEntry[] { entry1, entry2 });

            var expectedText = "[Thread 22]";

            // Act
            var outputText = formatter.FormatThread(entry, filters);

            // Assert
            Assert.That(outputText, Is.Not.Empty, "Expected a string to be returned");
            Assert.That(outputText, Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
Exemple #22
0
        public void FormatMethodExit_ReturnRecordedIsFalse_ExpectedTextIsReturned()
        {
            // Arrange
            var filters      = this.GetDefaultFilters();
            var formatter    = new DelimitedValuesFormatter();
            var entry        = new MethodExit(1, "Yalf.TestMethod", 345, false, "returnVal");
            var expectedText = "Yalf,Method,Yalf.TestMethod,,22:22:31.678,345,2,1";

            var relatedEntry = new MethodEntry(1, "Yalf.TestMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));

            formatter.FormatMethodEntry(1, 2, 33, relatedEntry, filters, true);

            // Act
            var orderedOutput = formatter.FormatMethodExitForSingleLineOutput(1, 2, 33, entry, filters, true);

            // Assert
            Assert.That(orderedOutput.Count, Is.Not.EqualTo(0), "Expected one string to be returned");
            Assert.That(orderedOutput[0].FormattedLine, Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
Exemple #23
0
        public void HandleMethodExit_ValidLog_ExpectedTextIsReturned()
        {
            // Arrange
            var filters      = this.GetDefaultFilters();
            var output       = new DefaultOutputHandler(filters);
            var entry        = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var expectedText = String.Concat("".PadLeft(2, output.Formatter.IndentChar), "[Exit] Yalf.TestMethod(returnVal) duration 345ms");

            output.Initialise();

            // Act
            output.HandleMethodExit(entry, 1, true);
            output.Complete();

            // Assert
            var outputText = output.GetReport();

            Assert.That(outputText, Is.Not.Empty, "Expected a string to be returned");
            Assert.That(outputText, Is.EqualTo(expectedText), "Not the expected output text, you may need to adjust the test if the formatter has been changed.");
        }
Exemple #24
0
        public void FormatMethodExit_HideMethodDurationIsSet_ExpectedTextIsReturned()
        {
            // Arrange
            var filters      = LogFiltersBuilder.Create().WithMethodDurationHidden().Build();
            var formatter    = new SingleLineFormatter();
            var entry        = new MethodExit(1, "Yalf.TestMethod", 345, true, "returnVal");
            var expectedText = "Yalf.TestMethod(returnVal) started 22:22:31.678";

            var relatedEntry = new MethodEntry(1, "Yalf.TestMethod", new[] { "param1", "param2" }, DateTime.Parse("2022-10-22 22:22:31.678"));

            formatter.FormatMethodEntry(1, 2, 33, relatedEntry, filters, true);

            // Act
            var orderedOutput = formatter.FormatMethodExitForSingleLineOutput(1, 2, 33, entry, filters, true);

            // Assert
            Assert.That(orderedOutput.Count, Is.EqualTo(1), "Expected one string to be returned");
            Assert.That(orderedOutput[0].Level, Is.EqualTo(0), "Not the expected nested level, you may need to adjust the test if the formatter has been changed.");
            Assert.That(orderedOutput[0].FormattedLine, Is.EqualTo(expectedText), "Not the expected formatted line, you may need to adjust the test if the formatter has been changed.");
        }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data          = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy)data.GetByte();
            var count         = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var       eventKind = (Jdwp.EventKind)data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                case Jdwp.EventKind.VmInit:
                    evt = new VmStart(data);
                    break;

                case Jdwp.EventKind.SingleStep:
                    evt = new SingleStep(data);
                    break;

                case Jdwp.EventKind.BreakPoint:
                    evt = new Breakpoint(data);
                    break;

                case Jdwp.EventKind.MethodEntry:
                    evt = new MethodEntry(data);
                    break;

                case Jdwp.EventKind.MethodExit:
                    evt = new MethodExit(data);
                    break;

                case Jdwp.EventKind.Exception:
                    evt = new Exception(data);
                    break;

                case Jdwp.EventKind.ThreadStart:
                    evt = new ThreadStart(data);
                    break;

                case Jdwp.EventKind.ThreadEnd:
                    evt = new ThreadDeath(data);
                    break;

                case Jdwp.EventKind.ClassPrepare:
                    evt = new ClassPrepare(data);
                    break;

                case Jdwp.EventKind.ClassUnload:
                    evt = new ClassUnload(data);
                    break;

                case Jdwp.EventKind.FieldAccess:
                    evt = new FieldAccess(data);
                    break;

                case Jdwp.EventKind.FieldModification:
                    evt = new FieldModification(data);
                    break;

                case Jdwp.EventKind.VmDeath:
                    evt = new VmDeath(data);
                    break;

                default:
                    throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                }).ContinueWith(task =>
                {
                    DLog.Error(DContext.DebuggerLibJdwpConnection, "HandleCompositeCommand: Internal failure on event processing. SuspendPolicy was {1}; IsCancelled={0}. Exception={1}", suspendPolicy, task.IsCanceled, task.Exception);
                    if (suspendPolicy != Jdwp.SuspendPolicy.None)
                    {
                        // we should better resume the VM, as the command handler may have failed to do so.
                        if (Connected)
                        {
                            VirtualMachine.ResumeAsync();
                        }
                    }
                }, TaskContinuationOptions.NotOnRanToCompletion);
            }
        }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data          = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy)data.GetByte();
            var count         = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var       eventKind = (Jdwp.EventKind)data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                case Jdwp.EventKind.VmInit:
                    evt = new VmStart(data);
                    break;

                case Jdwp.EventKind.SingleStep:
                    evt = new SingleStep(data);
                    break;

                case Jdwp.EventKind.BreakPoint:
                    evt = new Breakpoint(data);
                    break;

                case Jdwp.EventKind.MethodEntry:
                    evt = new MethodEntry(data);
                    break;

                case Jdwp.EventKind.MethodExit:
                    evt = new MethodExit(data);
                    break;

                case Jdwp.EventKind.Exception:
                    evt = new Exception(data);
                    break;

                case Jdwp.EventKind.ThreadStart:
                    evt = new ThreadStart(data);
                    break;

                case Jdwp.EventKind.ThreadEnd:
                    evt = new ThreadDeath(data);
                    break;

                case Jdwp.EventKind.ClassPrepare:
                    evt = new ClassPrepare(data);
                    break;

                case Jdwp.EventKind.ClassUnload:
                    evt = new ClassUnload(data);
                    break;

                case Jdwp.EventKind.FieldAccess:
                    evt = new FieldAccess(data);
                    break;

                case Jdwp.EventKind.FieldModification:
                    evt = new FieldModification(data);
                    break;

                case Jdwp.EventKind.VmDeath:
                    evt = new VmDeath(data);
                    break;

                default:
                    throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                });
            }
        }
 public string FormatMethodExit(int threadId, int level, int lineNo, MethodExit logEntry, ILogFilters filters, bool displayEnabled)
 {
     throw new NotImplementedException(String.Format("{0} does not need to immplement this method, use the ISingleLineOutputLogFormatter.FormatMethodExitForSingleLineOutput interface method so the calls are in the right order.", this.GetType().Name));
 }
Exemple #28
0
 public virtual TResult Visit(MethodExit e, TData data)
 {
     return(Visit((JdwpEvent)e, data));
 }
        /// <summary>
        /// Collates nested log calls and only returns an list of formatted log strings when a top level method exit log entry is envcountered
        /// </summary>
        /// <remarks>
        /// <para>This is required as, due to the nature of the single line formatter, nested logs are returned in the wrong order with the normal <see cref="FormatMethodExit"/> method.</para>
        /// <para>The indent must still be applied to the strings in the returned list in the <see cref="ILogOutputHandler"/>.  The first item will be the top level method call.</para>
        /// </remarks>
        public IList <OrderedOutput> FormatMethodExitForSingleLineOutput(int threadId, int level, int lineNo, MethodExit logEntry, ILogFilters filters, bool displayEnabled)
        {
            Func <DateTime, String> lineBuilder = null;

            if (displayEnabled)
            {
                lineBuilder = this.CreateMethodExitLineGenerator(logEntry, filters);
            }

            return(_delayedService.HandleMethodExit(logEntry, lineNo, filters, lineBuilder, displayEnabled));
        }
        private void HandleCompositeCommand(JdwpPacket packet)
        {
            var data = packet.Data;
            var suspendPolicy = (Jdwp.SuspendPolicy) data.GetByte();
            var count = data.GetInt();

            for (var i = 0; i < count; i++)
            {
                var eventKind = (Jdwp.EventKind) data.GetByte();
                JdwpEvent evt;
                switch (eventKind)
                {
                    case Jdwp.EventKind.VmInit:
                        evt = new VmStart(data);
                        break;
                    case Jdwp.EventKind.SingleStep:
                        evt = new SingleStep(data);
                        break;
                    case Jdwp.EventKind.BreakPoint:
                        evt = new Breakpoint(data);
                        break;
                    case Jdwp.EventKind.MethodEntry:
                        evt = new MethodEntry(data);
                        break;
                    case Jdwp.EventKind.MethodExit:
                        evt = new MethodExit(data);
                        break;
                    case Jdwp.EventKind.Exception:
                        evt = new Exception(data);
                        break;
                    case Jdwp.EventKind.ThreadStart:
                        evt = new ThreadStart(data);
                        break;
                    case Jdwp.EventKind.ThreadEnd:
                        evt = new ThreadDeath(data);
                        break;
                    case Jdwp.EventKind.ClassPrepare:
                        evt = new ClassPrepare(data);
                        break;
                    case Jdwp.EventKind.ClassUnload:
                        evt = new ClassUnload(data);
                        break;
                    case Jdwp.EventKind.FieldAccess:
                        evt = new FieldAccess(data);
                        break;
                    case Jdwp.EventKind.FieldModification:
                        evt = new FieldModification(data);
                        break;
                    case Jdwp.EventKind.VmDeath:
                        evt = new VmDeath(data);
                        break;
                    default:
                        throw new ArgumentException("Unknown event kind in compositive command " + (int)eventKind);
                }
                DLog.Debug(DContext.DebuggerLibDebugger, "JDWP event {0} {1}", eventKind, evt);
                Task.Factory.StartNew(() => {
                    evt.Accept(compositeCommandProcessor, suspendPolicy);
                }).ContinueWith(task =>
                {
                    DLog.Error(DContext.DebuggerLibJdwpConnection, "HandleCompositeCommand: Internal failure on event processing. SuspendPolicy was {1}; IsCancelled={0}. Exception={1}", suspendPolicy, task.IsCanceled, task.Exception);
                    if (suspendPolicy != Jdwp.SuspendPolicy.None)
                    {
                        // we should better resume the VM, as the command handler may have failed to do so.
                        if(Connected)
                            VirtualMachine.ResumeAsync();
                    }
                }, TaskContinuationOptions.NotOnRanToCompletion);
            }
        }
Exemple #31
0
 public void HandleMethodExit(MethodExit entry, int indentLevel, bool displayEnabled)
 {
     _outputHandler.HandleMethodExit(entry, indentLevel, displayEnabled);
 }
Exemple #32
0
        private Func <DateTime, string> CreateLineBuilderGenerator(int threadId, int level, MethodExit logEntry, ILogFilters filters)
        {
            var returnValue = (logEntry.ReturnRecorded && !filters.HideMethodReturnValue) ? logEntry.ReturnValue : "";

            return(startTime => BuildOutputLine("Method", logEntry.MethodName, returnValue, startTime, logEntry.ElapsedMs, level, threadId));
        }