diff options
author | Miguel Costa <miguel.costa@qt.io> | 2018-12-20 18:27:32 +0100 |
---|---|---|
committer | Miguel Costa <miguel.costa@qt.io> | 2019-01-07 14:33:26 +0000 |
commit | f826db692bbc682ca90e736977ccb2d82f2216fa (patch) | |
tree | b401aa67060fac8c77a20bd19eb350bffa7e6ea2 | |
parent | e76a53f6d5816d102c9c7b876c6c175f74056b10 (diff) |
Add debug messages to the QML debug engine
Issue some additional debug messages from the QML debug engine. These
messages will be shown in the 'Debug' output window of Visual Studio.
Task-number: QTVSADDINBUG-599
Change-Id: I30e26b8c90189cd80d0cf05c516a5a61100ab08e
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
5 files changed, 60 insertions, 6 deletions
diff --git a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Breakpoint.cs b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Breakpoint.cs index 32703a2c..8dc51c5d 100644 --- a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Breakpoint.cs +++ b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Breakpoint.cs @@ -276,8 +276,7 @@ namespace QtVsTools.Qml.Debug.AD7 void IBreakpoint.NotifyError(string errorMessage) { - QtProjectLib.Messages.PaneMessage(Vsix.Instance.Dte, - string.Format("QML Debug: {0}", errorMessage)); + Program.OutputWriteLine(errorMessage); } int IDebugBoundBreakpoint2.GetPendingBreakpoint( diff --git a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Engine.cs b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Engine.cs index cd2b39c3..41f6260b 100644 --- a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Engine.cs +++ b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Engine.cs @@ -192,6 +192,8 @@ namespace QtVsTools.Qml.Debug.AD7 DebugEvent.Send(new LoadCompleteEvent(program)); DebugEvent.Send(new EntryPointEvent(program)); + program.OutputWriteLine("Connecting to the QML runtime..."); + return VSConstants.S_OK; } @@ -262,6 +264,10 @@ namespace QtVsTools.Qml.Debug.AD7 pendingBreakpoint.Dispose(); } + public void OutputWriteLine(string msg) + { + DebugEvent.Send(new OutputStringEvent(this, msg + "\r\n")); + } #region //////////////////// Concurrent /////////////////////////////////////////////////// diff --git a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Events.cs b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Events.cs index 6743499e..10f42db7 100644 --- a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Events.cs +++ b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Events.cs @@ -254,4 +254,21 @@ namespace QtVsTools.Qml.Debug.AD7 return VSConstants.S_OK; } } + + class OutputStringEvent : DebugEvent, IDebugOutputStringEvent2 + { + string outputString; + + public OutputStringEvent(QmlEngine engine, string outputString) + : base(engine, typeof(IDebugOutputStringEvent2).GUID, ASYNCHRONOUS) + { + this.outputString = outputString; + } + + int IDebugOutputStringEvent2.GetString(out string pbstrString) + { + pbstrString = outputString; + return VSConstants.S_OK; + } + } } diff --git a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Program.cs b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Program.cs index 66fd5102..8e408387 100644 --- a/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Program.cs +++ b/src/qtvstools/QML/Debugging/AD7/QmlDebugAD7Program.cs @@ -151,6 +151,12 @@ namespace QtVsTools.Qml.Debug.AD7 } } + public void OutputWriteLine(string msg) + { + var execFileName = Path.GetFileName(ExecPath); + Engine.OutputWriteLine(string.Format("'{0}' (QML): {1}", execFileName, msg)); + } + bool IDebuggerEventSink.QueryRuntimeFrozen() { var debugMode = new DBGMODE[1]; @@ -166,8 +172,7 @@ namespace QtVsTools.Qml.Debug.AD7 void IDebuggerEventSink.NotifyError(string errorMessage) { - QtProjectLib.Messages.PaneMessage(Vsix.Instance.Dte, - string.Format("QML Debug: {0}", errorMessage)); + OutputWriteLine(errorMessage); } int IDebugEventCallback2.Event( diff --git a/src/qtvstools/QML/Debugging/QmlDebugLauncher.cs b/src/qtvstools/QML/Debugging/QmlDebugLauncher.cs index 571dc8af..e3a1f3c9 100644 --- a/src/qtvstools/QML/Debugging/QmlDebugLauncher.cs +++ b/src/qtvstools/QML/Debugging/QmlDebugLauncher.cs @@ -48,6 +48,7 @@ namespace QtVsTools.Qml.Debug public static Launcher Instance { get; private set; } IVsDebugger debugger; IVsDebugger4 debugger4; + IVsOutputWindowPane debugOutput; public static void Initialize() { @@ -56,6 +57,19 @@ namespace QtVsTools.Qml.Debug Instance.debugger4 = VsServiceProvider.GetService<IVsDebugger, IVsDebugger4>(); if (Instance.debugger != null && Instance.debugger4 != null) Instance.debugger.AdviseDebugEventCallback(Instance); + + var outputWindow = VsServiceProvider.GetService<SVsOutputWindow, IVsOutputWindow>(); + if (outputWindow != null) { + var debugOutputGuid = VSConstants.OutputWindowPaneGuid.DebugPane_guid; + var result = outputWindow.GetPane(ref debugOutputGuid, out Instance.debugOutput); + if (result != VSConstants.S_OK || Instance.debugOutput == null) { + Messages.PaneMessageSafe(Vsix.Instance.Dte, + "Unable to get reference to output window debug pane.", 5000); + } + } else { + Messages.PaneMessageSafe(Vsix.Instance.Dte, + "Unable to get reference to output window.", 5000); + } } private Launcher() @@ -169,6 +183,8 @@ namespace QtVsTools.Qml.Debug if (qtProject == null || !qtProject.IsQtMsBuildEnabled()) continue; + OutputWriteLine(string.Format("Debugging project '{0}'", vcProject.Name)); + var execArgs = props.GetPropertyValue("LocalDebuggerCommandArguments", vcConfig.Name, "UserFile"); if (string.IsNullOrEmpty(execArgs)) @@ -179,6 +195,8 @@ namespace QtVsTools.Qml.Debug if (!QmlDebugger.CheckCommandLine(execPath, cmd)) continue; + OutputWriteLine("QML debugging enabled"); + execCmd = cmd; rccItems = ((IVCCollection)vcProject.Files).Cast<VCFile>() .Where(x => x.ItemType == QtRcc.ItemTypeName) @@ -187,9 +205,17 @@ namespace QtVsTools.Qml.Debug return true; } + OutputWriteLine("QML debugging disabled"); + return false; } + void OutputWriteLine(string msg) + { + if (debugOutput != null) + debugOutput.OutputString(string.Format("Qt VS Tools: {0}\r\n", msg)); + } + void LaunchDebug( string execPath, string execCmd, @@ -207,13 +233,14 @@ namespace QtVsTools.Qml.Debug LaunchFlags = (uint)__VSDBGLAUNCHFLAGS5.DBGLAUNCH_BreakOneProcess, }}; + OutputWriteLine("Starting QML debug engine..."); + var processInfo = new VsDebugTargetProcessInfo[targets.Length]; try { debugger4.LaunchDebugTargets4((uint)targets.Length, targets, processInfo); } catch (Exception e) { - Messages.PaneMessageSafe(Vsix.Instance.Dte, - e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace, 5000); + OutputWriteLine(e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace); } } } |