示例#1
0
        void NotifyTargetEvent(MD.Thread thread, MD.TargetEventArgs args)
        {
            if (args.Frame != null)
            {
                activeThread = args.Frame.Thread;
            }

            try {
                if (args.Type == MD.TargetEventType.TargetStopped && ((int)args.Data) != 0)
                {
                    DispatchEvent(delegate {
                        controller.OnDebuggerOutput(false, string.Format("Thread {0:x} received signal {1}.\n", args.Frame.Thread.ID, args.Data));
                    });
                }

                DL.TargetEventType type;

                switch (args.Type)
                {
                case MD.TargetEventType.Exception: type = DL.TargetEventType.ExceptionThrown; break;

                case MD.TargetEventType.TargetHitBreakpoint: type = DL.TargetEventType.TargetHitBreakpoint; break;

                case MD.TargetEventType.TargetInterrupted: type = DL.TargetEventType.TargetInterrupted; break;

                case MD.TargetEventType.TargetSignaled: type = DL.TargetEventType.TargetSignaled; break;

                case MD.TargetEventType.TargetStopped: type = DL.TargetEventType.TargetStopped; break;

                case MD.TargetEventType.UnhandledException: type = DL.TargetEventType.UnhandledException; break;

                default:
                    return;
                }

                OnCleanFrameData();

                DL.TargetEventArgs targetArgs = new DL.TargetEventArgs(type);

                if (args.Type != MD.TargetEventType.TargetExited)
                {
                    ML.TargetObject exception = null;
                    if (args.Type == MD.TargetEventType.UnhandledException || args.Type == MD.TargetEventType.Exception)
                    {
                        exception = args.Frame.ExceptionObject;
                    }
                    targetArgs.Backtrace = CreateBacktrace(thread, exception);
                    targetArgs.Thread    = CreateThreadInfo(activeThread);
                }


                running = false;

                DispatchEvent(delegate {
                    controller.OnTargetEvent(targetArgs);
                });
            } catch (Exception e) {
                Console.WriteLine("*** DS.OnTargetEvent2, exception : {0}", e.ToString());
            }
        }
示例#2
0
        private void OnTargetEvent(MD.Thread thread, MD.TargetEventArgs args)
        {
            try {
                if (!running)
                {
                    LogEvent(args);
                    return;
                }

                bool notifyToClient = args.IsStopped || args.Type == MD.TargetEventType.UnhandledException || args.Type == MD.TargetEventType.Exception || args.Type == MD.TargetEventType.TargetInterrupted;

                LogEvent(args);

                bool isStop = args.Type != MD.TargetEventType.FrameChanged &&
                              args.Type != MD.TargetEventType.TargetExited &&
                              args.Type != MD.TargetEventType.TargetRunning;

                if (isStop)
                {
                    lock (debugger) {
                        if (stoppedWorkQueue.Count > 0)
                        {
                            // Execute queued work in another thread with a small delay
                            // since it is not safe to execute it here
                            System.Threading.ThreadPool.QueueUserWorkItem(delegate {
                                System.Threading.Thread.Sleep(50);
                                bool resume = false;
                                lock (debugger) {
                                    foreach (ST.WaitCallback cb in stoppedWorkQueue)
                                    {
                                        cb(null);
                                    }
                                    stoppedWorkQueue.Clear();
                                }
                                if (resume)
                                {
                                    guiManager.Continue(process.MainThread);
                                }
                                else if (notifyToClient)
                                {
                                    NotifyTargetEvent(thread, args);
                                }
                            });
                            return;
                        }
                    }
                }

                if (notifyToClient)
                {
                    NotifyTargetEvent(thread, args);
                }
            } catch (Exception e) {
                Console.WriteLine("*** DS.OnTargetEvent1, exception : {0}", e.ToString());
            }
        }
示例#3
0
 void LogEvent(MD.TargetEventArgs args)
 {
     Console.WriteLine("Server OnTargetEvent: {0} stopped:{1} data:{2} queue:{3} thread:{4} running:{5}", args.Type, args.IsStopped, args.Data, stoppedWorkQueue.Count, args.Frame != null ? args.Frame.Thread : null, running);
 }
示例#4
0
        void OperationCompleted(SingleSteppingEngine caller, TargetEventArgs result, ThreadingModel model)
        {
            if (!ThreadManager.InBackgroundThread)
                throw new InternalError ();

            foreach (Process process in process_hash.Values) {
                process.OperationCompleted (caller, result, model);
            }

            lock (this) {
                current_operation = null;
                stopped_event.Set ();
            }
        }
示例#5
0
 protected virtual void OnTargetEvent(Thread thread, TargetEventArgs args)
 {
     if ((args.Type != TargetEventType.TargetSignaled) &&
         (args.Type != TargetEventType.TargetExited) &&
         (args.Type != TargetEventType.TargetInterrupted))
         CurrentThread = thread;
     Style.TargetEvent (thread, args);
 }
示例#6
0
 internal void OnTargetEvent(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Debugger.OnTargetEvent (sse.Client, args);
 }
示例#7
0
 void IOperationHost.OperationCompleted(SingleSteppingEngine caller, TargetEventArgs result, ThreadingModel model)
 {
     Process.OperationCompleted (caller, result, model);
 }
示例#8
0
文件: Style.cs 项目: baulig/debugger
 public abstract void TargetEvent(Thread thread, TargetEventArgs args);
示例#9
0
文件: Thread.cs 项目: baulig/debugger
 void IOperationHost.OperationCompleted(SingleSteppingEngine sse, TargetEventArgs args, ThreadingModel model)
 {
 }
示例#10
0
 void IOperationHost.SendResult(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Process.Debugger.OnTargetEvent(sse.Client, args);
 }
示例#11
0
 void IOperationHost.OperationCompleted(SingleSteppingEngine caller, TargetEventArgs result, ThreadingModel model)
 {
     Process.OperationCompleted(caller, result, model);
 }
示例#12
0
 internal void OnTargetEvent(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Debugger.OnTargetEvent(sse.Client, args);
 }
示例#13
0
 void IOperationHost.SendResult(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Debugger.OnTargetEvent(sse.Thread, args);
 }
示例#14
0
        protected override void OnTargetEvent(Mono.Debugger.Thread thread, TargetEventArgs args)
        {
            switch (args.Type) {

                case TargetEventType.TargetStopped: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "TargetStopped";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg3 = "";

                    newEvent.arg2 = (int)args.Data;

                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.TargetRunning: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "TargetRunning";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = 0;
                    newEvent.arg3 = "";
                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.TargetInterrupted: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "TargetInterrupted";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = 0;
                    newEvent.arg3 = "";
                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.FrameChanged: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "FrameChanged";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = 0;
                    newEvent.arg3 = "";
                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.TargetHitBreakpoint: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "TargetHitBreakpoint";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = (int)args.Data;
                    newEvent.arg3 = "";

                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.TargetSignaled: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "TargetSignaled";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = (int)args.Data;
                    newEvent.arg3 = "";

                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.TargetExited: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "TargetExited";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = (int)args.Data;
                    newEvent.arg3 = "";

                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.Exception: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "Exception";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = 0;
                    newEvent.arg3 = "";

                    eventList.Add(newEvent);
                    break;
                }

                case TargetEventType.UnhandledException: {
                    eventData newEvent = new eventData();
                    newEvent.eventType = "UnhandledException";
                    newEvent.arg1 = thread.ID;
                    newEvent.arg2 = 0;
                    newEvent.arg3 = "";

                    eventList.Add(newEvent);
                    break;
                }
            }

            base.OnTargetEvent(thread,args);
        }
示例#15
0
 void IOperationHost.SendResult(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Debugger.OnTargetEvent (sse.Thread, args);
 }
示例#16
0
文件: Thread.cs 项目: baulig/debugger
 internal override void Completed(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Host.OperationCompleted (sse, args, ThreadingModel);
     if (args != null)
         Host.SendResult (sse, args);
 }
示例#17
0
文件: Style.cs 项目: baulig/debugger
        public override void TargetEvent(Thread thread, TargetEventArgs args)
        {
            if (args.Frame != null)
                TargetEvent (thread, args.Frame, args);

            switch (args.Type) {
            case TargetEventType.TargetExited:
                if ((int) args.Data != 0)
                    interpreter.Print ("{0} exited with exit code {1}.",
                               thread.Name, (int) args.Data);
                break;

            case TargetEventType.TargetSignaled:
                interpreter.Print ("{0} died with fatal signal {1}.",
                           thread.Name, (int) args.Data);
                break;
            }
        }
示例#18
0
        internal virtual void Completed(SingleSteppingEngine sse, TargetEventArgs args)
        {
            if ((args != null) && ((args.Type == TargetEventType.TargetExited) || (args.Type == TargetEventType.TargetSignaled))) {
                if ((sse.Thread.ThreadFlags & Thread.Flags.StopOnExit) == 0) {
                    Host.SendResult (sse, args);
                    return;
                }
            }

            if (!IsCompleted) {
                IsCompleted = true;
                if (args != null)
                    Host.SendResult (sse, args);
                Host.OperationCompleted (sse, args, ThreadingModel);
            }
        }
示例#19
0
文件: Style.cs 项目: baulig/debugger
        protected void TargetEvent(Thread target, StackFrame frame,
					    TargetEventArgs args)
        {
            switch (args.Type) {
            case TargetEventType.TargetStopped: {
                if ((int) args.Data != 0)
                    interpreter.Print ("{0} received signal {1} at {2}.",
                               target.Name, (int) args.Data, frame);
                else if (!interpreter.IsInteractive)
                    break;
                else
                    interpreter.Print ("{0} stopped at {1}.", target.Name, frame);

                if (interpreter.IsScript)
                    break;

                AssemblerLine insn;
                try {
                    insn = target.DisassembleInstruction (
                        frame.Method, frame.TargetAddress);
                } catch {
                    insn = null;
                }

                interpreter.Style.TargetStopped (interpreter, frame, insn);

                break;
            }

            case TargetEventType.TargetHitBreakpoint: {
                if (!interpreter.IsInteractive)
                    break;

                interpreter.Print ("{0} hit breakpoint {1} at {2}.",
                           target.Name, (int) args.Data, frame);

                if (interpreter.IsScript)
                    break;

                AssemblerLine insn;
                try {
                    insn = target.DisassembleInstruction (
                        frame.Method, frame.TargetAddress);
                } catch {
                    insn = null;
                }

                interpreter.Style.TargetStopped (interpreter, frame, insn);

                break;
            }

            case TargetEventType.Exception:
            case TargetEventType.UnhandledException: {
                interpreter.Print ("{0} caught {2}exception at {1}.", target.Name, frame,
                           args.Type == TargetEventType.Exception ?
                           "" : "unhandled ");

                if (interpreter.IsScript)
                    break;

                AssemblerLine insn;
                try {
                    insn = target.DisassembleInstruction (
                        frame.Method, frame.TargetAddress);
                } catch {
                    insn = null;
                }

                interpreter.Style.UnhandledException (interpreter, frame, insn);

                break;
            }
            }
        }
示例#20
0
        public override void TargetEvent(Thread thread, TargetEventArgs args)
        {
            if (TargetEventEvent != null)
                TargetEventEvent (thread, args);

            base.TargetEvent (thread, args);
        }
示例#21
0
 void IOperationHost.SendResult(SingleSteppingEngine sse, TargetEventArgs args)
 {
     Process.Debugger.OnTargetEvent (sse.Client, args);
 }
 private void target_event(object sender, TargetEventArgs args)
 {
     switch (args.Type) {
     case TargetEventType.TargetExited:
     case TargetEventType.TargetSignaled:
         KillApplication (null);
         break;
     case TargetEventType.TargetStopped:
     case TargetEventType.TargetRunning:
         ChangeState (null);
         break;
     case TargetEventType.TargetHitBreakpoint:
     default:
         break;
     }
 }
示例#23
0
        internal void OperationCompleted(SingleSteppingEngine caller, TargetEventArgs result, ThreadingModel model)
        {
            if (!ThreadManager.InBackgroundThread && Inferior.HasThreadEvents)
                throw new InternalError ();

            if (current_state == ProcessState.Stopping)
                return;
            else if (current_state != ProcessState.Running)
                throw new InternalError ();

            if ((result != null) && (caller != main_thread) &&
                ((result.Type == TargetEventType.TargetExited) || (result.Type == TargetEventType.TargetSignaled)))
                return;

            current_state = ProcessState.Stopping;
            SuspendUserThreads (model, caller);

            lock (this) {
                current_state = ProcessState.Stopped;
                current_operation.Completed ();
                current_operation = null;
                stopped_event.Set ();
            }
        }
示例#24
0
        bool BreakEventCheck(MD.TargetEventArgs args)
        {
            MD.StackFrame frame = args.Frame;
            if (!(args.Data is int))
            {
                return(true);
            }

            int eventHandle = (int)args.Data;

            DL.BreakEvent be;
            if (!events.TryGetValue(eventHandle, out be))
            {
                return(true);
            }

            // Check hit count
            if (be.HitCount > 0)
            {
                be.HitCount--;
                DispatchEvent(delegate {
                    NotifyBreakEventUpdate(eventHandle, be.HitCount, null);
                });
                return(false);
            }

            MdbEvaluationContext ctx = new MdbEvaluationContext(frame.Thread, frame, null, SessionOptions.EvaluationOptions);

            DL.Breakpoint bp = be as DL.Breakpoint;
            if (bp != null && !string.IsNullOrEmpty(bp.ConditionExpression))
            {
                ML.TargetObject val = EvaluateExp(ctx, bp.ConditionExpression);
                if (val == null)
                {
                    return(false);
                }
                if (bp.BreakIfConditionChanges)
                {
                    string current = evaluator.TargetObjectToExpression(ctx, val).Value;
                    string last;
                    bool   found = lastConditionValue.TryGetValue(eventHandle, out last);
                    lastConditionValue [eventHandle] = current;
                    if (!found || last == current)
                    {
                        return(false);
                    }
                }
                else
                {
                    ML.TargetFundamentalObject fob = val as ML.TargetFundamentalObject;
                    if (fob == null)
                    {
                        return(false);
                    }
                    object ob = fob.GetObject(frame.Thread);
                    if (!(ob is bool) || !(bool)ob)
                    {
                        return(false);
                    }
                }
            }

            switch (be.HitAction)
            {
            case HitAction.Break:
                return(true);

            case HitAction.CustomAction:
                return(controller.OnCustomBreakpointAction(be.CustomActionId, eventHandle));

            case HitAction.PrintExpression:
                if (string.IsNullOrEmpty(be.TraceExpression) || frame == null)
                {
                    return(false);
                }
                ML.TargetObject val = EvaluateExp(ctx, be.TraceExpression);
                if (val != null)
                {
                    string str = evaluator.TargetObjectToString(ctx, val);
                    DispatchEvent(delegate {
                        NotifyBreakEventUpdate(eventHandle, -1, str);
                    });
                }
                return(false);
            }
            return(false);
        }
示例#25
0
 public void target_event(Thread thread, TargetEventArgs args)
 {
     if (((thread.ThreadFlags & Thread.Flags.Daemon) != 0) &&
         ((args.Type == TargetEventType.TargetExited) ||
          (args.Type == TargetEventType.TargetSignaled)))
         return;
     interpreter.OnTargetEvent (thread, args);
 }
示例#26
0
 internal void OnTargetEvent(Thread thread, TargetEventArgs args)
 {
     try {
         if (TargetEvent != null)
             TargetEvent (thread, args);
     } catch (Exception ex) {
         Error ("{0} caught exception while sending {1}:\n{2}",
                thread, args, ex);
     }
 }