Example #1
0
        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);
        }
Example #2
0
        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));
        }