diff --git a/src/Ben.Demystifier/Ben.Demystifier.csproj b/src/Ben.Demystifier/Ben.Demystifier.csproj index 5de05ba..fdce526 100644 --- a/src/Ben.Demystifier/Ben.Demystifier.csproj +++ b/src/Ben.Demystifier/Ben.Demystifier.csproj @@ -9,7 +9,7 @@ git true true - 0.0.2 + 0.0.3 diff --git a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs index 4265d4b..968d637 100644 --- a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs +++ b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs @@ -59,8 +59,8 @@ namespace System.Diagnostics var fileName = frame.GetFileName(); var row = frame.GetFileLineNumber(); var column = frame.GetFileColumnNumber(); - - if (string.IsNullOrEmpty(fileName)) + var ilOffset = frame.GetILOffset(); + if (string.IsNullOrEmpty(fileName) && ilOffset >= 0) { // .NET Framework and older versions of mono don't support portable PDBs // so we read it manually to get file name and line information @@ -168,7 +168,20 @@ namespace System.Diagnostics if (method is System.Reflection.MethodInfo mi) { - methodDisplayInfo.ReturnParameter = GetParameter(mi.ReturnParameter); + var returnParameter = mi.ReturnParameter; + if (returnParameter != null) + { + methodDisplayInfo.ReturnParameter = GetParameter(mi.ReturnParameter); + } + else if (mi.ReturnType != null) + { + methodDisplayInfo.ReturnParameter = new ResolvedParameter + { + Prefix = "", + Name = "", + Type = TypeNameHelper.GetTypeDisplayName(mi.ReturnType, fullName: false, includeGenericParameterNames: true).ToString(), + }; + } } if (method.IsGenericMethod) diff --git a/test/Ben.Demystifier.Test/DynamicCompilation.cs b/test/Ben.Demystifier.Test/DynamicCompilation.cs new file mode 100644 index 0000000..81fa9a7 --- /dev/null +++ b/test/Ben.Demystifier.Test/DynamicCompilation.cs @@ -0,0 +1,54 @@ +using System; +using System.Diagnostics; +using System.Linq.Expressions; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Xunit; + +namespace Demystify +{ + public class DynamicCompilation + { + [Fact] + public async Task DoesNotPreventStackTrace() + { + // Arrange + var expression = Expression.Throw( + Expression.New( + typeof(ArgumentException).GetConstructor( + new Type[] {typeof(string)}), + Expression.Constant( "Message"))); + + var lambda = Expression.Lambda(expression); + + var action = lambda.Compile(); + + // Act + Exception demystifiedException = null; + try + { + await Task.Run(() => action()).ConfigureAwait(false); + } + catch(Exception ex) + { + demystifiedException = ex.Demystify(); + } + + // Assert + var stackTrace = demystifiedException.ToString(); + stackTrace = ReplaceLineEndings.Replace(stackTrace, ""); + var trace = stackTrace.Split(Environment.NewLine); + + Assert.Equal( + new[] { + "System.ArgumentException: Message", + " at void lambda_method(Closure)", + " at Task Demystify.DynamicCompilation.DoesNotPreventThrowStackTrace()+()=>{}", + " at void System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, object state)", + " at async Task Demystify.DynamicCompilation.DoesNotPreventThrowStackTrace()"}, + trace); + } + + private Regex ReplaceLineEndings = new Regex(" in [^\n\r]+"); + } +}