Example #1
0
        private void Initialize()
        {
            _debugger = CreateDebuggerClient();
            _control = _debugger as IDebugControl4;
            _symbols = _debugger as IDebugSymbols4;
            _systemObjects = _debugger as IDebugSystemObjects3;
            _advanced = _debugger as IDebugAdvanced3;
            _spaces = _debugger as IDebugDataSpaces4;

            // in case previous debugging session hasn't finished correctly
            // some leftover breakpoints may exist (even if debugging target has changed)
            _control.ClearBreakpoints();
            _requestHelper = new RequestHelper(_advanced, _spaces, _symbols);
            _commandExecutor = new CommandExecutor(_control);
            _output = new OutputCallbacks();

            _callbacks = new EventCallbacks(_control);
            _callbacks.BreakpointHit += OnBreakpoint;
            _callbacks.ExceptionHit += OnException;
            _callbacks.BreakHappened += OnBreak;
            _callbacks.ThreadStarted += OnThreadStarted;
            _callbacks.ThreadFinished += OnThreadFinished;
            _callbacks.ProcessExited += OnProcessExited;

            _debugger.SetEventCallbacks(_callbacks);
            _debugger.SetOutputCallbacks(_output);
            _debugger.SetInputCallbacks(new InputCallbacks());

            _visualizers = new VisualizerRegistry(new DefaultVisualizer(_requestHelper, _symbols, _output));
            InitializeHandlers();
        }
Example #2
0
        /// <summary>
        /// Requests the specified request type.
        /// </summary>
        /// <param name="client">The DbgEng.dll Advanced interface.</param>
        /// <param name="requestType">Type of the request.</param>
        /// <param name="request">The request.</param>
        /// <returns></returns>
        public static EXT_TYPED_DATA Request(this IDebugAdvanced3 client, DebugRequest requestType, EXT_TYPED_DATA request)
        {
            using (var requestNative = new MarshalStructure <EXT_TYPED_DATA>())
            {
                uint outSize;

                requestNative.Structure = request;
                client.Request(requestType, requestNative.Pointer, requestNative.USize, requestNative.Pointer, requestNative.USize, out outSize);
                return(requestNative.Structure);
            }
        }
Example #3
0
        /// <summary>
        /// Requests the specified request type with extended structure.
        /// </summary>
        /// <param name="client">The DbgEng.dll Advanced interface.</param>
        /// <param name="requestType">Type of the request.</param>
        /// <param name="request">The request.</param>
        /// <param name="extended">The extended string.</param>
        public static EXT_TYPED_DATA RequestExtended(this IDebugAdvanced3 client, DebugRequest requestType, EXT_TYPED_DATA request, string extended)
        {
            using (var requestNative = new MarshalStructureExtendedWithAnsiString <EXT_TYPED_DATA>())
            {
                uint outSize;

                requestNative.Extended  = extended;
                requestNative.Structure = request;
                client.Request(requestType, requestNative.Pointer, requestNative.USize, requestNative.Pointer, requestNative.USize, out outSize);
                return(requestNative.Structure);
            }
        }
Example #4
0
        private void Dispose(bool disposing)
        {
            if (!_isDisposed)
            {
                if (disposing)
                {
                    _cancel.Cancel();

                    if (_debuggerThread != null)
                        _debuggerThread.Join(TimeSpan.FromMilliseconds(100));

                    if (_callbacks != null)
                    {
                        _callbacks.BreakpointHit -= OnBreakpoint;
                        _callbacks.ExceptionHit -= OnException;
                        _callbacks.BreakHappened -= OnBreak;
                        _callbacks.ThreadFinished -= OnThreadFinished;
                        _callbacks.ThreadStarted -= OnThreadStarted;
                        _callbacks.ProcessExited -= OnProcessExited;
                    }

                    if (_debugger != null)
                    {
                        _debugger.EndSession(DEBUG_END.ACTIVE_TERMINATE);
                        _debugger.SetEventCallbacks(null);
                        _debugger.SetOutputCallbacks(null);
                        _debugger.SetInputCallbacks(null);
                    }

                    _callbacks = null;
                    _messages.Dispose();
                }

                if (_debugger != null)
                {
                    while (Marshal.ReleaseComObject(_debugger) > 0)
                    {
                    }
                }

                _debugger = null;
                _control = null;
                _symbols = null;
                _spaces = null;
                _systemObjects = null;

                _advanced = null;
                _requestHelper = null;

                _isDisposed = true;
            }
        }
Example #5
0
        private DebugClient(object client, TaskScheduler scheduler)
        {
            _scheduler = scheduler;

            Client        = (IDebugClient5)client;
            Control       = (IDebugControl7)client;
            DataSpaces    = (IDebugDataSpaces4)client;
            SystemObjects = (IDebugSystemObjects2)client;
            Symbols       = (IDebugSymbols5)client;
            Advanced      = (IDebugAdvanced3)client;

            Client.SetEventCallbacksWide(this).ThrowIfFailed();
            Client.SetOutputCallbacksWide(this).ThrowIfFailed();

            Control.AddEngineOptions(DEBUG_ENGOPT.INITIAL_BREAK);
        }
Example #6
0
        public RequestHelper(IDebugAdvanced3 advanced, IDebugDataSpaces spaces, IDebugSymbols4 symbols)
        {
            if (advanced == null)
            {
                throw new ArgumentNullException(nameof(advanced));
            }

            if (spaces == null)
            {
                throw new ArgumentNullException(nameof(spaces));
            }

            if (symbols == null)
            {
                throw new ArgumentNullException(nameof(symbols));
            }

            _advanced = advanced;
            _spaces   = spaces;
            _symbols  = symbols;
        }