From 4130eca12429310ab08085d057efa1b0a609a3ce Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 1 Mar 2019 17:25:40 -0800 Subject: [PATCH 1/5] Update changelog. --- Extension/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 80cba64048..ead95e80f6 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -12,6 +12,7 @@ * Add C/C++ compiler build tasks for compiling the active source file. [PR #3118](https://github.com/Microsoft/vscode-cpptools/pull/3118) * Fix command not found and empty `c_cpp_properties.json` if activation is too slow. [#3160](https://github.com/Microsoft/vscode-cpptools/issues/3160), [#3176](https://github.com/Microsoft/vscode-cpptools/issues/3176) * Add AutoPCH support to reduce IntelliSense parsing time, with `C_Cpp.intelliSenseCachePath` and `C_Cpp.intelliSenseCacheSize` settings. [PR #3184](https://github.com/Microsoft/vscode-cpptools/pull/3184) +* Fix `cppvsdbg` debugger showing `"An unspecified error has occurred."` for structured binding variables. [#3197](https://github.com/Microsoft/vscode-cpptools/issues/3197) ## Version 0.22.0-insiders: February 6, 2019 * Fix crash on Windows when 8.3 filenames are used. [#2453](https://github.com/Microsoft/vscode-cpptools/issues/2453), [#3104](https://github.com/Microsoft/vscode-cpptools/issues/3104) From 12d6b9c96925683e0675da43c18cfa58576a550f Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Fri, 1 Mar 2019 19:29:53 -0800 Subject: [PATCH 2/5] Fix debug launch bugs. --- Extension/package.json | 15 +++++++++++++++ Extension/src/Debugger/configurationProvider.ts | 13 ++++++------- Extension/src/Debugger/extension.ts | 4 ++-- Extension/src/common.ts | 2 ++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Extension/package.json b/Extension/package.json index 8727b00ebc..e5d15681e1 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -587,6 +587,11 @@ "command": "C_Cpp.TakeSurvey", "title": "%c_cpp.command.takeSurvey.title%", "category": "C/C++" + }, + { + "command": "C_Cpp.BuildAndDebugActiveFile", + "title": "%c_cpp.command.buildAndDebugActiveFile.title%", + "category": "C/C++" } ], "keybindings": [ @@ -1393,6 +1398,16 @@ "when": "editorLangId == cpp", "command": "workbench.action.showAllSymbols", "group": "other@4" + }, + { + "when": "editorLangId == cpp", + "command": "C_Cpp.BuildAndDebugActiveFile", + "group": "other@5" + }, + { + "when": "editorLangId == c", + "command": "C_Cpp.BuildAndDebugActiveFile", + "group": "other@5" } ] }, diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 7723bccdf1..92a6643db1 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -7,10 +7,9 @@ import * as debugUtils from './utils'; import * as os from 'os'; import * as path from 'path'; import * as vscode from 'vscode'; -import { /*getBuildTasks,*/ BuildTaskDefinition } from '../LanguageServer/extension'; +import { getBuildTasks, BuildTaskDefinition } from '../LanguageServer/extension'; import * as util from '../common'; import * as fs from 'fs'; -//import * as assert from 'assert'; import * as Telemetry from '../telemetry'; import { buildAndDebugActiveFileStr } from './extension'; @@ -57,9 +56,9 @@ export class QuickPickConfigurationProvider implements vscode.DebugConfiguration return vscode.window.showQuickPick(items, {placeHolder: "Select a configuration"}).then(async selection => { // Wrap in new Promise to make sure task kicks off before VS Code switches the active document to launch.json - return new Promise(async resolve => { + return new Promise(async (resolve, reject) => { if (!selection) { - return resolve([defaultConfig]); // User canceled it. Choose the default config? + return reject([]); // User canceled it. } if (selection.label.indexOf(buildAndDebugActiveFileStr()) !== -1 && selection.configuration.preLaunchTask) { try { @@ -93,8 +92,8 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { * Returns a list of initial debug configurations based on contextual information, e.g. package.json or folder. */ async provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): Promise { - let buildTasks: vscode.Task[]; // = await getBuildTasks(); // TODO - if (!buildTasks || buildTasks.length === 0) { + let buildTasks: vscode.Task[] = await getBuildTasks(); // TODO + if (buildTasks.length === 0 || this.type === DebuggerType.cppvsdbg) { return Promise.resolve(this.provider.getInitialConfigurations(this.type)); } const defaultConfig: vscode.DebugConfiguration = this.provider.getInitialConfigurations(this.type).find(config => { @@ -127,7 +126,7 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { const suffix: string = suffixIndex === -1 ? "" : compilerName.substr(suffixIndex); debuggerName = (platform === "darwin" ? "lldb" : "lldb-mi") + suffix; } else { - debuggerName = "gdb"; + debuggerName = platform === "win32" ? "gdb.exe" : "gdb"; } const debuggerPath: string = path.join(compilerDirname, debuggerName); diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index 35497a5aef..9bc54c3ddb 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import * as os from 'os'; import { AttachPicker, RemoteAttachPicker, AttachItemsProvider } from './attachToProcess'; import { NativeAttachItemsProviderFactory } from './nativeAttach'; -import { /*QuickPickConfigurationProvider,*/ ConfigurationAssetProviderFactory, CppVsDbgConfigurationProvider, CppDbgConfigurationProvider, ConfigurationSnippetProvider, IConfigurationAssetProvider } from './configurationProvider'; +import { QuickPickConfigurationProvider, ConfigurationAssetProviderFactory, CppVsDbgConfigurationProvider, CppDbgConfigurationProvider, ConfigurationSnippetProvider, IConfigurationAssetProvider } from './configurationProvider'; import { CppdbgDebugAdapterDescriptorFactory, CppvsdbgDebugAdapterDescriptorFactory } from './debugAdapterDescriptorFactory'; import * as util from '../common'; import * as Telemetry from '../telemetry'; @@ -35,7 +35,7 @@ export function initialize(context: vscode.ExtensionContext): void { disposables.push(vscode.debug.registerDebugConfigurationProvider('cppvsdbg', new CppVsDbgConfigurationProvider(configurationProvider))); } const provider: CppDbgConfigurationProvider = new CppDbgConfigurationProvider(configurationProvider); - disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', provider)); //new QuickPickConfigurationProvider(provider))); // TODO + disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', new QuickPickConfigurationProvider(provider))); // TODO disposables.push(vscode.commands.registerTextEditorCommand("C_Cpp.BuildAndDebugActiveFile", async (textEditor: vscode.TextEditor, edit: vscode.TextEditorEdit, ...args: any[]) => { const folder: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(textEditor.document.uri); diff --git a/Extension/src/common.ts b/Extension/src/common.ts index 10f57c03c9..c47bf3e062 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -83,6 +83,8 @@ export async function ensureBuildTaskExists(taskName: string): Promise { delete definition.compilerPath; } + rawTasksJson.version = "2.0.0"; + if (!rawTasksJson.tasks.find(task => { return task.label === selectedTask.definition.label; })) { rawTasksJson.tasks.push(selectedTask.definition); } From f2c7b9471e164c433e4b8311e260a71abd7b1044 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 4 Mar 2019 18:54:25 -0800 Subject: [PATCH 3/5] Code review fixes. --- Extension/src/Debugger/configurationProvider.ts | 8 ++++++-- Extension/src/Debugger/extension.ts | 2 +- Extension/src/main.ts | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 92a6643db1..adcbf68b7b 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -92,7 +92,7 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { * Returns a list of initial debug configurations based on contextual information, e.g. package.json or folder. */ async provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): Promise { - let buildTasks: vscode.Task[] = await getBuildTasks(); // TODO + let buildTasks: vscode.Task[] = await getBuildTasks(); if (buildTasks.length === 0 || this.type === DebuggerType.cppvsdbg) { return Promise.resolve(this.provider.getInitialConfigurations(this.type)); } @@ -126,7 +126,11 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { const suffix: string = suffixIndex === -1 ? "" : compilerName.substr(suffixIndex); debuggerName = (platform === "darwin" ? "lldb" : "lldb-mi") + suffix; } else { - debuggerName = platform === "win32" ? "gdb.exe" : "gdb"; + debuggerName = "gdb"; + } + + if (platform === "win32") { + debuggerName += ".exe"; } const debuggerPath: string = path.join(compilerDirname, debuggerName); diff --git a/Extension/src/Debugger/extension.ts b/Extension/src/Debugger/extension.ts index 9bc54c3ddb..c49b82c2af 100644 --- a/Extension/src/Debugger/extension.ts +++ b/Extension/src/Debugger/extension.ts @@ -35,7 +35,7 @@ export function initialize(context: vscode.ExtensionContext): void { disposables.push(vscode.debug.registerDebugConfigurationProvider('cppvsdbg', new CppVsDbgConfigurationProvider(configurationProvider))); } const provider: CppDbgConfigurationProvider = new CppDbgConfigurationProvider(configurationProvider); - disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', new QuickPickConfigurationProvider(provider))); // TODO + disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', new QuickPickConfigurationProvider(provider))); disposables.push(vscode.commands.registerTextEditorCommand("C_Cpp.BuildAndDebugActiveFile", async (textEditor: vscode.TextEditor, edit: vscode.TextEditorEdit, ...args: any[]) => { const folder: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(textEditor.document.uri); diff --git a/Extension/src/main.ts b/Extension/src/main.ts index fa28ffb376..ea519b3b61 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -329,7 +329,7 @@ function rewriteManifest(): Promise { "onLanguage:c", "onCommand:extension.pickNativeProcess", "onCommand:extension.pickRemoteNativeProcess", - //"onCommand:C_Cpp.BuildAndDebugActiveFile", // TODO + "onCommand:C_Cpp.BuildAndDebugActiveFile", "onCommand:C_Cpp.ConfigurationEdit", "onCommand:C_Cpp.ConfigurationSelect", "onCommand:C_Cpp.ConfigurationProviderSelect", From d6c0d99441872370ed64c760d8cbf43937b960c3 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 5 Mar 2019 14:46:42 -0800 Subject: [PATCH 4/5] Fix Mac debugging when lldb isn't found. --- Extension/src/Debugger/configurationProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index adcbf68b7b..6aa7ded81c 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -140,7 +140,7 @@ class CppConfigurationProvider implements vscode.DebugConfigurationProvider { newConfig.miDebuggerPath = debuggerPath; } else { // TODO should probably resolve a missing debugger in a more graceful fashion for win32. - newConfig.miDebuggerPath = path.join("/usr", "bin", debuggerName); + newConfig.miDebuggerPath = (platform === "darwin" ? undefined : path.join("/usr", "bin", debuggerName)); } return resolve(newConfig); From 1f18ee93f56de12068f1a4ca05f0160c1c53b447 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Tue, 5 Mar 2019 15:51:20 -0800 Subject: [PATCH 5/5] Code review changes. --- .../src/Debugger/configurationProvider.ts | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/Extension/src/Debugger/configurationProvider.ts b/Extension/src/Debugger/configurationProvider.ts index 6aa7ded81c..6c5941595e 100644 --- a/Extension/src/Debugger/configurationProvider.ts +++ b/Extension/src/Debugger/configurationProvider.ts @@ -54,24 +54,20 @@ export class QuickPickConfigurationProvider implements vscode.DebugConfiguration return menuItem; }); - return vscode.window.showQuickPick(items, {placeHolder: "Select a configuration"}).then(async selection => { - // Wrap in new Promise to make sure task kicks off before VS Code switches the active document to launch.json - return new Promise(async (resolve, reject) => { - if (!selection) { - return reject([]); // User canceled it. - } - if (selection.label.indexOf(buildAndDebugActiveFileStr()) !== -1 && selection.configuration.preLaunchTask) { - try { - await util.ensureBuildTaskExists(selection.configuration.preLaunchTask); - await vscode.debug.startDebugging(folder, selection.configuration); - Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" }); - } catch (e) { - Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" }); - } - } - return resolve([selection.configuration]); - }); - }); + const selection: MenuItem = await vscode.window.showQuickPick(items, {placeHolder: "Select a configuration"}); + if (!selection) { + throw new Error(); // User canceled it. + } + if (selection.label.indexOf(buildAndDebugActiveFileStr()) !== -1 && selection.configuration.preLaunchTask) { + try { + await util.ensureBuildTaskExists(selection.configuration.preLaunchTask); + await vscode.debug.startDebugging(folder, selection.configuration); + Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" }); + } catch (e) { + Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" }); + } + } + return [selection.configuration]; } resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult {