public AD7StackFrame(AD7Engine engine, AD7Thread thread, JStackFrame threadContext) { _engine = engine; _thread = thread; _stackFrame = threadContext; _parameters = threadContext.Parameters.ToArray(); _locals = threadContext.Locals.ToArray(); }
// EnumThreads is called by the debugger when it needs to enumerate the threads in the program. public int EnumThreads(out IEnumDebugThreads2 ppEnum) { AssertMainThread(); AD7Thread[] threadObjects = new AD7Thread[_threads.Count]; int i = 0; foreach (var keyValue in _threads) { var thread = keyValue.Key; var adThread = keyValue.Value; Debug.Assert(adThread != null); threadObjects[i++] = adThread; } ppEnum = new AD7ThreadEnum(threadObjects); return VSConstants.S_OK; }
private void SendThreadStart(AD7Thread ad7Thread) { Send(new AD7ThreadCreateEvent(), AD7ThreadCreateEvent.IID, ad7Thread); }
private void SendLoadComplete(AD7Thread thread) { Debug.WriteLine("Sending load complete" + GetHashCode()); AD7ProgramCreateEvent.Send(this); Send(new AD7LoadCompleteEvent(), AD7LoadCompleteEvent.IID, thread); if (_startModule != null) { SendModuleLoaded(_startModule); _startModule = null; } if (_startThread != null) { SendThreadStart(_startThread); _startThread = null; } _processLoadedThread = null; _loadComplete.Set(); var attached = EngineAttached; if (attached != null) { attached(this, new AD7EngineEventArgs(this)); } }
private void OnThreadCreated(object sender, ThreadEventArgs e) { Debug.WriteLine("Thread created: " + e.Thread.Id); var newThread = new AD7Thread(this, e.Thread); _threads.Add(e.Thread, newThread); lock (_syncLock) { if (_programCreated) { SendThreadStart(newThread); } else { _startThread = newThread; } } }
private void OnProcessLoaded(object sender, ThreadEventArgs e) { lock (_syncLock) { if (_pseudoAttach) { _process.Unregister(); } if (_programCreated) { // we've delviered the program created event, deliver the load complete event SendLoadComplete(_threads[e.Thread]); } else { Debug.WriteLine("Delaying load complete " + GetHashCode() + " on thread " + _threads[e.Thread].GetDebuggedThread().Id); // we haven't delivered the program created event, wait until we do to deliver the process loaded event. _processLoadedThread = _threads[e.Thread]; } } }
private void OnDebuggerOutput(object sender, OutputEventArgs e) { AD7Thread thread; if (!_threads.TryGetValue(e.Thread, out thread)) { _threads[e.Thread] = thread = new AD7Thread(this, e.Thread); } Send(new AD7DebugOutputStringEvent2(e.Output), AD7DebugOutputStringEvent2.IID, thread); }
private void OnAsyncBreakComplete(object sender, ThreadEventArgs e) { AD7Thread thread; if (!_threads.TryGetValue(e.Thread, out thread)) { _threads[e.Thread] = thread = new AD7Thread(this, e.Thread); } Send(new AD7AsyncBreakCompleteEvent(), AD7AsyncBreakCompleteEvent.IID, thread); }