From 4e09194e72264afe703b7042a0f1363f018b4214 Mon Sep 17 00:00:00 2001 From: Sara Itani Date: Sat, 12 Sep 2015 04:11:08 -0700 Subject: [PATCH] #362 Debugger listening but program not starting The issue in this case stems from sending an AD7LodCompleteRunningEvent when we should be sending an AD7LoadCompleteEvent. In particular, _processLoadedRunning is set to true here even though execution ends up being paused later. The fix is to only load the "running" value after modules are loaded, rather than beforehand. are loaded, so load the property then rather than beforehand. --- .../Nodejs/Debugger/DebugEngine/AD7Engine.cs | 8 ++--- .../Product/Nodejs/Debugger/NodeDebugger.cs | 25 +++++++++----- .../Nodejs/Debugger/ProcessLoadedEventArgs.cs | 33 ------------------- Nodejs/Product/Nodejs/Nodejs.csproj | 1 - 4 files changed, 19 insertions(+), 48 deletions(-) delete mode 100644 Nodejs/Product/Nodejs/Debugger/ProcessLoadedEventArgs.cs diff --git a/Nodejs/Product/Nodejs/Debugger/DebugEngine/AD7Engine.cs b/Nodejs/Product/Nodejs/Debugger/DebugEngine/AD7Engine.cs index e1d52914e..6457d3a87 100644 --- a/Nodejs/Product/Nodejs/Debugger/DebugEngine/AD7Engine.cs +++ b/Nodejs/Product/Nodejs/Debugger/DebugEngine/AD7Engine.cs @@ -61,7 +61,6 @@ public sealed class AD7Engine : IDebugEngine2, IDebugEngineLaunch2, IDebugProgra private AD7Thread _mainThread; private bool _sdmAttached; private bool _processLoaded; - private bool _processLoadedRunning; private bool _loadComplete; private readonly object _syncLock = new object(); private bool _attached; @@ -255,7 +254,7 @@ private void HandleLoadComplete() { } lock (_syncLock) { - if (_processLoadedRunning) { + if (_processLoaded && _process.IsRunning()) { Send(new AD7LoadCompleteRunningEvent(), AD7LoadCompleteRunningEvent.IID, _mainThread); } else { Send(new AD7LoadCompleteEvent(), AD7LoadCompleteEvent.IID, _mainThread); @@ -1125,10 +1124,9 @@ private void OnStepComplete(object sender, ThreadEventArgs e) { Send(new AD7SteppingCompleteEvent(), AD7SteppingCompleteEvent.IID, _threads[e.Thread]); } - private void OnProcessLoaded(object sender, ProcessLoadedEventArgs e) { + private void OnProcessLoaded(object sender, ThreadEventArgs e) { lock (_syncLock) { _processLoaded = true; - _processLoadedRunning = e.Running; HandleLoadComplete(); } } @@ -1138,7 +1136,6 @@ private void OnProcessExited(object sender, ProcessExitedEventArgs e) { _processExitedEvent.Set(); lock (_syncLock) { _processLoaded = false; - _processLoadedRunning = false; Send(new AD7ProgramDestroyEvent((uint)e.ExitCode), AD7ProgramDestroyEvent.IID, null); } } catch (InvalidOperationException) { @@ -1152,6 +1149,7 @@ private void OnModuleLoaded(object sender, ModuleLoadedEventArgs e) { if (_loadComplete) { SendModuleLoad(adModule); } + } } diff --git a/Nodejs/Product/Nodejs/Debugger/NodeDebugger.cs b/Nodejs/Product/Nodejs/Debugger/NodeDebugger.cs index 16bb5ff6d..8839bb6fa 100644 --- a/Nodejs/Product/Nodejs/Debugger/NodeDebugger.cs +++ b/Nodejs/Product/Nodejs/Debugger/NodeDebugger.cs @@ -243,8 +243,16 @@ public async Task BreakAllAsync() { if (asyncBreakComplete != null) { asyncBreakComplete(this, new ThreadEventArgs(MainThread)); } - } - + } + + internal bool IsRunning() { + var backtraceCommand = new BacktraceCommand(CommandId, _resultFactory, 0, 1); + if (TrySendRequestAsync(backtraceCommand).GetAwaiter().GetResult()) { + return backtraceCommand.Running; + } + return false; + } + private void DebugWriteCommand(string commandName) { LiveLogger.WriteLine("NodeDebugger Called " + commandName); } @@ -492,18 +500,17 @@ public void StartListening() { if (!backTraceTask.Wait((int)_timeout.TotalMilliseconds)) { throw new TimeoutException("Timed out while performing initial backtrace."); } - bool running = backTraceTask.GetAwaiter().GetResult(); // At this point we can fire events EventHandler newThread = ThreadCreated; if (newThread != null) { newThread(this, new ThreadEventArgs(mainThread)); - } - - EventHandler procLoaded = ProcessLoaded; + } + EventHandler procLoaded = ProcessLoaded; if (procLoaded != null) { - procLoaded(this, new ProcessLoadedEventArgs(mainThread, running)); - } + procLoaded(this, new ThreadEventArgs(MainThread)); + } + } private void OnConnectionClosed(object sender, EventArgs args) { @@ -1170,7 +1177,7 @@ internal async Task SetVariableValueAsync( /// /// Fired when the process has started and is broken into the debugger, but before any user code is run. /// - public event EventHandler ProcessLoaded; + public event EventHandler ProcessLoaded; public event EventHandler ThreadCreated; public event EventHandler ThreadExited; diff --git a/Nodejs/Product/Nodejs/Debugger/ProcessLoadedEventArgs.cs b/Nodejs/Product/Nodejs/Debugger/ProcessLoadedEventArgs.cs deleted file mode 100644 index 56d0781b4..000000000 --- a/Nodejs/Product/Nodejs/Debugger/ProcessLoadedEventArgs.cs +++ /dev/null @@ -1,33 +0,0 @@ -//*********************************************************// -// Copyright (c) Microsoft. All rights reserved. -// -// Apache 2.0 License -// -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -// implied. See the License for the specific language governing -// permissions and limitations under the License. -// -//*********************************************************// - -using System; - -namespace Microsoft.NodejsTools.Debugger { - class ProcessLoadedEventArgs : ThreadEventArgs { - private readonly bool _running; - - public ProcessLoadedEventArgs(NodeThread thread, bool running) : base(thread) { - _running = running; - } - - public bool Running { - get { - return _running; - } - } - } -} diff --git a/Nodejs/Product/Nodejs/Nodejs.csproj b/Nodejs/Product/Nodejs/Nodejs.csproj index abb769c0e..2d5349419 100644 --- a/Nodejs/Product/Nodejs/Nodejs.csproj +++ b/Nodejs/Product/Nodejs/Nodejs.csproj @@ -662,7 +662,6 @@ -