Skip to content

Commit e8c1839

Browse files
authored
Exception source code (#19)
* Include source code to the exception/message reports * Changelog update + version update * Removed redundant function
1 parent 6440eb9 commit e8c1839

File tree

8 files changed

+83
-23
lines changed

8 files changed

+83
-23
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Backtrace Unity Release Notes
22

3+
## Version 2.1.5
4+
5+
- Added exception source code information to exception and message type of reports.
6+
37
## Version 2.1.4
48

59
- `EnvironmentVariable` class now will handle correctly nullable key/values,

Runtime/Model/BacktraceData.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -174,18 +174,13 @@ public static BacktraceData Deserialize(string json)
174174
/// </summary>
175175
private void SetThreadInformations()
176176
{
177-
var faultingThread =
178-
Report.Exception is BacktraceUnhandledException
179-
&& string.IsNullOrEmpty(Report.Exception.StackTrace)
180-
? false
181-
: true;
177+
var faultingThread = !(Report.Exception is BacktraceUnhandledException
178+
&& string.IsNullOrEmpty(Report.Exception.StackTrace));
179+
182180
ThreadData = new ThreadData(Report.DiagnosticStack, faultingThread);
183181
ThreadInformations = ThreadData.ThreadInformations;
184182
MainThread = ThreadData.MainThread;
185-
if (Report.Exception is BacktraceUnhandledException)
186-
{
187-
SourceCode = (Report.Exception as BacktraceUnhandledException).SourceCode;
188-
}
183+
SourceCode = Report.SourceCode;
189184
}
190185

191186
/// <summary>
@@ -211,7 +206,7 @@ private void SetReportInformation()
211206
LangVersion = "Mono";
212207
#endif
213208

214-
AgentVersion = "2.1.4";
209+
AgentVersion = "2.1.5";
215210
Classifier = Report.ExceptionTypeReport ? new[] { Report.Classifier } : null;
216211
}
217212
}

Runtime/Model/BacktraceReport.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ public class BacktraceReport
8080
[JsonProperty(PropertyName = "minidumpFile")]
8181
internal string MinidumpFile { get; private set; }
8282

83+
/// <summary>
84+
/// Source code
85+
/// </summary>
86+
public BacktraceSourceCode SourceCode = null;
87+
8388
/// <summary>
8489
/// Convert Backtrace report to JSON
8590
/// </summary>
@@ -171,6 +176,9 @@ public BacktraceReport(
171176
: this(null as Exception, attributes, attachmentPaths)
172177
{
173178
Message = message;
179+
// analyse stack trace information in both constructor
180+
// to include error message in both source code properties.
181+
SetStacktraceInformation();
174182
}
175183

176184
/// <summary>
@@ -192,9 +200,9 @@ public BacktraceReport(
192200
{
193201
Message = exception.Message;
194202
SetReportFingerPrintForEmptyStackTrace();
203+
SetStacktraceInformation();
195204
}
196205
Classifier = ExceptionTypeReport ? exception.GetType().Name : string.Empty;
197-
SetStacktraceInformation();
198206
}
199207

200208
/// <summary>
@@ -249,8 +257,9 @@ internal static Dictionary<string, object> ConcatAttributes(
249257

250258
internal void SetStacktraceInformation()
251259
{
252-
var stacktrace = new BacktraceStackTrace(Exception);
260+
var stacktrace = new BacktraceStackTrace(Message, Exception);
253261
DiagnosticStack = stacktrace.StackFrames;
262+
SourceCode = stacktrace.SourceCode;
254263
}
255264
/// <summary>
256265
/// create a copy of BacktraceReport for inner exception object inside exception

Runtime/Model/BacktraceStackFrame.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,5 +165,10 @@ private string GetMethodName(StackFrame frame)
165165
string fullMethodName = string.Format("{0}.{1}()", method.DeclaringType == null ? null : method.DeclaringType.ToString(), methodName);
166166
return fullMethodName;
167167
}
168+
169+
public override string ToString()
170+
{
171+
return string.Format("{0} (at {1}:{2})", FunctionName, Library, Line);
172+
}
168173
}
169174
}

Runtime/Model/BacktraceStackTrace.cs

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,45 @@
1-
using Backtrace.Unity.Common;
2-
using System;
1+
using System;
32
using System.Collections.Generic;
43
using System.Diagnostics;
5-
using System.Reflection;
4+
using System.Linq;
65

76
namespace Backtrace.Unity.Model
87
{
98
/// <summary>
109
/// Backtrace stack trace
1110
/// </summary>
12-
public class BacktraceStackTrace
11+
internal class BacktraceStackTrace
1312
{
1413
/// <summary>
1514
/// Stack trace frames
1615
/// </summary>
17-
public List<BacktraceStackFrame> StackFrames = new List<BacktraceStackFrame>();
16+
public readonly List<BacktraceStackFrame> StackFrames = new List<BacktraceStackFrame>();
17+
18+
public BacktraceSourceCode SourceCode = null;
1819

1920
/// <summary>
2021
/// Current exception
2122
/// </summary>
2223
private readonly Exception _exception;
23-
public BacktraceStackTrace(Exception exception)
24+
25+
/// <summary>
26+
/// Report message
27+
/// </summary>
28+
private readonly string _message;
29+
30+
/// <summary>
31+
/// Report stack trace
32+
/// </summary>
33+
private string _stackTrace = string.Empty;
34+
35+
public BacktraceStackTrace(string message, Exception exception)
2436
{
37+
_message = message;
2538
_exception = exception;
39+
if (exception != null)
40+
{
41+
_stackTrace = exception.StackTrace;
42+
}
2643
Initialize();
2744
}
2845

@@ -35,11 +52,12 @@ private void Initialize()
3552
{
3653
var current = _exception as BacktraceUnhandledException;
3754
StackFrames.InsertRange(0, current.StackFrames);
55+
SourceCode = current.SourceCode;
56+
return;
3857
}
3958
else
4059
{
4160
var exceptionStackTrace = new StackTrace(_exception, true);
42-
4361
var exceptionFrames = exceptionStackTrace.GetFrames();
4462
SetStacktraceInformation(exceptionFrames, true);
4563
}
@@ -51,7 +69,12 @@ private void Initialize()
5169
//reverse frame order
5270
var frames = stackTrace.GetFrames();
5371
SetStacktraceInformation(frames, generateExceptionInformation);
72+
if (StackFrames.Any())
73+
{
74+
_stackTrace = string.Join("\n", StackFrames.Select(n => n.ToString()));
75+
}
5476
}
77+
CreateUnhandledExceptionLogInformation();
5578
}
5679

5780
private void SetStacktraceInformation(StackFrame[] frames, bool generatedByException = false)
@@ -78,5 +101,29 @@ private void SetStacktraceInformation(StackFrame[] frames, bool generatedByExcep
78101
startingIndex++;
79102
}
80103
}
104+
105+
106+
/// <summary>
107+
/// Assign source code information to first stack frame of unhandled exception report
108+
/// </summary>
109+
private void CreateUnhandledExceptionLogInformation()
110+
{
111+
// we can't assign source code to any stack frame.
112+
if (!StackFrames.Any())
113+
{
114+
return;
115+
}
116+
117+
SourceCode = new BacktraceSourceCode()
118+
{
119+
Text = string.Format("Unity exception information\nMessage: {0}\nStack trace: {1}", _message, _stackTrace)
120+
};
121+
// assign log information to first stack frame
122+
if (StackFrames.Count == 0)
123+
{
124+
return;
125+
}
126+
StackFrames.First().SourceCode = SourceCode.Id.ToString();
127+
}
81128
}
82129
}

Runtime/Model/BacktraceUnhandledException.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public BacktraceUnhandledException(string message, string stacktrace) : base(mes
5151
} else
5252
{
5353
_stacktrace = string.Empty;
54-
var backtraceStackTrace = new BacktraceStackTrace(null);
54+
var backtraceStackTrace = new BacktraceStackTrace(message, null);
5555
StackFrames = backtraceStackTrace.StackFrames;
5656
}
5757
CreateUnhandledExceptionLogInformation();

Tests/Runtime/BacktraceStackTraceTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public IEnumerator TestReportStackTrace_StackTraceShouldIncludeEnvironmentStackT
114114
[UnityTest]
115115
public IEnumerator TestStackTraceCreation_EmptyStackTrace_ValidStackTraceObject()
116116
{
117-
var backtraceStackTrace = new BacktraceStackTrace(new Exception());
117+
var backtraceStackTrace = new BacktraceStackTrace(string.Empty, new Exception());
118118
Assert.IsTrue(backtraceStackTrace.StackFrames.Count == 0);
119119
yield return null;
120120
}
@@ -134,7 +134,7 @@ public IEnumerator TestStackTraceCreation_UnityEngineException_ValidStackTraceOb
134134

135135
string message = "message";
136136
var exception = new BacktraceUnhandledException(message, stackTrace);
137-
var backtraceStackTrace = new BacktraceStackTrace(exception);
137+
var backtraceStackTrace = new BacktraceStackTrace(string.Empty, exception);
138138

139139
//skip first frame
140140
int startIndex = exception.Header ? 1 : 0;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "io.backtrace.unity",
33
"displayName": "Backtrace",
4-
"version": "2.1.4",
4+
"version": "2.1.5",
55
"unity": "2017.1",
66
"description": "Backtrace's integration with Unity games allows customers to capture and report handled and unhandled Unity exceptions to their Backtrace instance, instantly offering the ability to prioritize and debug software errors.",
77
"keywords": [

0 commit comments

Comments
 (0)