private bool TryCallback(ThreadServant thread, TargetMemoryAccess memory,
ref StackFrame frame, bool exact_match)
{
try {
if (frame == null)
return false;
Inferior.CallbackFrame callback = thread.GetCallbackFrame (
frame.StackPointer, exact_match);
if (callback == null)
return false;
frame = thread.Architecture.CreateFrame (
thread.Client, FrameType.Normal, memory, callback.Registers);
FrameType callback_type;
string frame_name = "<method called from mdb>";
if (callback.IsRuntimeInvokeFrame) {
callback_type = FrameType.RuntimeInvoke;
TargetFunctionType func = thread.GetRuntimeInvokedFunction (callback.ID);
if (func != null)
frame_name = String.Format ("<Invocation of: {0}>", func.FullName);
} else {
callback_type = FrameType.Callback;
}
AddFrame (new StackFrame (
thread.Client, callback_type, callback.CallAddress, callback.StackPointer,
TargetAddress.Null, callback.Registers, thread.NativeLanguage,
new Symbol (frame_name, callback.CallAddress, 0)));
return true;
} catch (TargetException) {
return false;
}
}