Skip to content

Commit fdbf872

Browse files
author
David Karlaš
committed
Change evaluation of ExceptionInfo so it works with .NetCore debugger
1 parent 21de57b commit fdbf872

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

Mono.Debugging/Mono.Debugging.Client/ExceptionInfo.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ public ObjectValue Instance {
112112
get {
113113
if (instance == null)
114114
instance = exception.GetChild ("Instance");
115-
115+
if (instance == null)
116+
return exception;
116117
return instance;
117118
}
118119
}
@@ -137,7 +138,7 @@ public ExceptionStackFrame[] StackTrace {
137138
return frames;
138139

139140
var stackTrace = exception.GetChild ("StackTrace");
140-
if (stackTrace == null)
141+
if (stackTrace == null || stackTrace.IsNull)
141142
return frames = new ExceptionStackFrame [0];
142143

143144
if (stackTrace.IsEvaluating) {
@@ -146,9 +147,13 @@ public ExceptionStackFrame[] StackTrace {
146147
return frames;
147148
}
148149

150+
if (stackTrace.TypeName == "string") {
151+
stackTrace = Debugging.Evaluation.ExceptionInfoSource.GetStackTrace (stackTrace.Value);
152+
}
153+
149154
var list = new List<ExceptionStackFrame> ();
150-
foreach (var val in stackTrace.GetAllChildren ())
151-
list.Add (new ExceptionStackFrame (val));
155+
for (int i = 0; i < stackTrace.ArrayCount; i++)
156+
list.Add (new ExceptionStackFrame (stackTrace.GetArrayItem (i, EvaluationOptions.DefaultOptions)));
152157

153158
frames = list.ToArray ();
154159

@@ -160,7 +165,7 @@ public ExceptionInfo InnerException {
160165
get {
161166
if (innerException == null) {
162167
ObjectValue innerVal = exception.GetChild ("InnerException");
163-
if (innerVal == null || innerVal.IsError || innerVal.IsUnknown)
168+
if (innerVal == null || innerVal.IsNull || innerVal.IsError || innerVal.IsUnknown)
164169
return null;
165170
if (innerVal.IsEvaluating) {
166171
innerVal.ValueChanged += delegate { NotifyChanged (); };
@@ -261,7 +266,7 @@ public ExceptionStackFrame (ObjectValue value)
261266

262267
public string File {
263268
get {
264-
ObjectValue file = frame.GetChild ("File");
269+
ObjectValue file = frame.GetChild ("File", EvaluationOptions.DefaultOptions);
265270
if (file != null)
266271
return file.Value;
267272

@@ -271,7 +276,7 @@ public string File {
271276

272277
public int Line {
273278
get {
274-
ObjectValue val = frame.GetChild ("Line");
279+
ObjectValue val = frame.GetChild ("Line", EvaluationOptions.DefaultOptions);
275280
if (val != null)
276281
return int.Parse (val.Value);
277282

@@ -281,7 +286,7 @@ public int Line {
281286

282287
public int Column {
283288
get {
284-
ObjectValue val = frame.GetChild ("Column");
289+
ObjectValue val = frame.GetChild ("Column", EvaluationOptions.DefaultOptions);
285290
if (val != null)
286291
return int.Parse (val.Value);
287292

Mono.Debugging/Mono.Debugging.Evaluation/ExceptionInfoSource.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,24 +148,25 @@ public ObjectValue CreateObjectValue (bool withTimeout, EvaluationOptions option
148148
ObjectValue stackTraceValue;
149149
if (withTimeout) {
150150
stackTraceValue = ctx.Adapter.CreateObjectValueAsync ("StackTrace", ObjectValueFlags.None, delegate {
151-
return GetStackTrace (options, exceptionType);
151+
var stackTrace = ctx.Adapter.GetMember (ctx, Exception, exceptionType, Exception.Value, "StackTrace");
152+
if (stackTrace == null)
153+
return ObjectValue.CreateUnknown ("StackTrace");
154+
return GetStackTrace (stackTrace.ObjectValue as string);
152155
});
153156
} else {
154-
stackTraceValue = GetStackTrace (options, exceptionType);
157+
var stackTrace = ctx.Adapter.GetMember (ctx, Exception, exceptionType, Exception.Value, "StackTrace");
158+
if (stackTrace == null)
159+
return ObjectValue.CreateUnknown ("StackTrace");
160+
stackTraceValue = GetStackTrace (stackTrace.ObjectValue as string);
155161
}
156162

157163
var children = new ObjectValue [] { excInstance, messageValue, stackTraceValue, childExceptionValue, childExceptionsValue };
158164

159165
return ObjectValue.CreateObject (null, new ObjectPath ("InnerException"), type, "", ObjectValueFlags.None, children);
160166
}
161167

162-
ObjectValue GetStackTrace (EvaluationOptions options, object exceptionType)
168+
public static ObjectValue GetStackTrace (string trace)
163169
{
164-
var stackTrace = ctx.Adapter.GetMember (ctx, Exception, exceptionType, Exception.Value, "StackTrace");
165-
if (stackTrace == null)
166-
return ObjectValue.CreateUnknown ("StackTrace");
167-
168-
string trace = stackTrace.ObjectValue as string;
169170
if (trace == null)
170171
return ObjectValue.CreateUnknown ("StackTrace");
171172

@@ -174,7 +175,7 @@ ObjectValue GetStackTrace (EvaluationOptions options, object exceptionType)
174175
var frames = new List<ObjectValue> ();
175176

176177
foreach (var sframe in trace.Split ('\n')) {
177-
string text = sframe.Trim (' ', '\r', '\t');
178+
string text = sframe.Trim (' ', '\r', '\t', '"');
178179
string file = "";
179180
int column = 0;
180181
int line = 0;

0 commit comments

Comments
 (0)