private void HandleEvent(GdbEvent ev) { if (ev.Name != "stopped") { return; } CleanTempVariableObjects(); BreakEvent breakEvent = null; TargetEventType type = TargetEventType.TargetStopped; if (!string.IsNullOrEmpty(ev.Reason)) { switch (ev.Reason) { case "breakpoint-hit": type = TargetEventType.TargetHitBreakpoint; var breakPointNumber = ev.GetInt("bkptno"); if (!CheckBreakpoint(breakPointNumber)) { RunCommand("-exec-continue"); return; } breakEvent = breakpoints[breakPointNumber].BreakEvent; break; case "watchpoint-trigger": type = TargetEventType.TargetHitBreakpoint; var watchPointNumber = ev.GetObject("wpt").GetInt("number"); breakEvent = breakpoints[watchPointNumber].BreakEvent; break; case "signal-received": if (ev.GetValue("signal-name") == "SIGINT") { type = TargetEventType.TargetInterrupted; } else { type = TargetEventType.TargetSignaled; } break; case "exited": case "exited-signalled": case "exited-normally": type = TargetEventType.TargetExited; break; default: type = TargetEventType.TargetStopped; break; } } ResultData curFrame = ev.GetObject("frame"); FireTargetEvent(type, curFrame, breakEvent); }
private StackFrame CreateFrame(ResultData frameData) { string lang = "Native"; string func = frameData.GetValue("func"); string sadr = frameData.GetValue("addr"); if (func == "??" && session.IsMonoProcess) { // Try to get the managed func name try { ResultData data = session.RunCommand("-data-evaluate-expression", "mono_pmip(" + sadr + ")"); string val = data.GetValue("value"); if (val != null) { int i = val.IndexOf('"'); if (i != -1) { func = val.Substring(i).Trim('"', ' '); lang = "Mono"; } } } catch { } } int line = -1; string sline = frameData.GetValue("line"); if (sline != null) { line = int.Parse(sline); } string sfile = frameData.GetValue("fullname"); if (sfile == null) { sfile = frameData.GetValue("file"); } if (sfile == null) { sfile = frameData.GetValue("from"); } var loc = new SourceLocation(func ?? "?", sfile, line, -1, -1, -1, null); long addr; if (!string.IsNullOrEmpty(sadr)) { addr = long.Parse(sadr.Substring(2), NumberStyles.HexNumber); } else { addr = 0; } return(new StackFrame(addr, loc, lang)); }