Index: lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py +++ lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py @@ -341,3 +341,68 @@ # "exitCommands" that were run after the second breakpoint was hit output = self.get_console(timeout=1.0) self.verify_commands('exitCommands', output, exitCommands) + + @skipIfWindows + @skipIfDarwin # Skip this test for now until we can figure out why tings aren't working on build bots + @no_debug_info_test + def test_extra_launch_commands(self): + ''' + Tests the "luanchCommands" with extra launching settings + ''' + self.build_and_create_debug_adaptor() + program = self.getBuildArtifact("a.out") + + source = 'main.c' + first_line = line_number(source, '// breakpoint 1') + second_line = line_number(source, '// breakpoint 2') + # Set target binary and 2 breakoints + # then we can varify the "launchCommands" get run + # also we can verify that "stopCommands" get run as the + # breakpoints get hit + launchCommands = [ + 'target create "%s"' % (program), + 'br s -f main.c -l %d' % first_line, + 'br s -f main.c -l %d' % second_line, + 'run' + ] + + initCommands = ['target list', 'platform list'] + preRunCommands = ['image list a.out', 'image dump sections a.out'] + stopCommands = ['frame variable', 'bt'] + exitCommands = ['expr 2+3', 'expr 3+4'] + self.launch(program, + initCommands=initCommands, + preRunCommands=preRunCommands, + stopCommands=stopCommands, + exitCommands=exitCommands, + launchCommands=launchCommands) + + # Get output from the console. This should contain both the + # "initCommands" and the "preRunCommands". + output = self.get_console() + # Verify all "initCommands" were found in console output + self.verify_commands('initCommands', output, initCommands) + # Verify all "preRunCommands" were found in console output + self.verify_commands('preRunCommands', output, preRunCommands) + + # Verify all "launchCommands" were founc in console output + # After execution, program should launch + self.verify_commands('launchCommands', output, launchCommands) + # Verify the "stopCommands" here + self.continue_to_next_stop() + output = self.get_console(timeout=1.0) + self.verify_commands('stopCommands', output, stopCommands) + + # Continue and hit the second breakpoint. + # Get output from the console. This should contain both the + # "stopCommands" that were run after the first breakpoint was hit + self.continue_to_next_stop() + output = self.get_console(timeout=1.0) + self.verify_commands('stopCommands', output, stopCommands) + + # Continue until the program exits + self.continue_to_exit() + # Get output from the console. This should contain both the + # "exitCommands" that were run after the second breakpoint was hit + output = self.get_console(timeout=1.0) + self.verify_commands('exitCommands', output, exitCommands) Index: lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py +++ lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py @@ -245,20 +245,17 @@ self.assertTrue(response['success'], 'attach failed (%s)' % (response['message'])) - def build_and_launch(self, program, args=None, cwd=None, env=None, - stopOnEntry=False, disableASLR=True, - disableSTDIO=False, shellExpandArguments=False, - trace=False, initCommands=None, preRunCommands=None, - stopCommands=None, exitCommands=None, - sourcePath=None, debuggerRoot=None): - '''Build the default Makefile target, create the VSCode debug adaptor, - and launch the process. + def launch(self, program=None, args=None, cwd=None, env=None, + stopOnEntry=False, disableASLR=True, + disableSTDIO=False, shellExpandArguments=False, + trace=False, initCommands=None, preRunCommands=None, + stopCommands=None, exitCommands=None,sourcePath= None, + debuggerRoot=None, launchCommands=None): + '''Sending launch request to vscode ''' - self.build_and_create_debug_adaptor() - self.assertTrue(os.path.exists(program), 'executable must exist') - # Make sure we disconnect and terminate the VSCode debug adaptor even - # if we throw an exception during the test case. + # Make sure we disconnet and terminate the VSCode debug adaptor, + # if we throw an exception during the test case def cleanup(): self.vscode.request_disconnect(terminateDebuggee=True) self.vscode.terminate() @@ -283,7 +280,25 @@ stopCommands=stopCommands, exitCommands=exitCommands, sourcePath=sourcePath, - debuggerRoot=debuggerRoot) + debuggerRoot=debuggerRoot, + launchCommands=launchCommands) if not (response and response['success']): self.assertTrue(response['success'], 'launch failed (%s)' % (response['message'])) + + def build_and_launch(self, program, args=None, cwd=None, env=None, + stopOnEntry=False, disableASLR=True, + disableSTDIO=False, shellExpandArguments=False, + trace=False, initCommands=None, preRunCommands=None, + stopCommands=None, exitCommands=None, + sourcePath=None, debuggerRoot=None): + '''Build the default Makefile target, create the VSCode debug adaptor, + and launch the process. + ''' + self.build_and_create_debug_adaptor() + self.assertTrue(os.path.exists(program), 'executable must exist') + + self.launch(program, args, cwd, env, stopOnEntry, disableASLR, + disableSTDIO, shellExpandArguments, trace, + initCommands, preRunCommands, stopCommands, exitCommands, + sourcePath, debuggerRoot) Index: lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py +++ lldb/trunk/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py @@ -558,7 +558,7 @@ disableSTDIO=False, shellExpandArguments=False, trace=False, initCommands=None, preRunCommands=None, stopCommands=None, exitCommands=None, sourcePath=None, - debuggerRoot=None): + debuggerRoot=None, launchCommands=None): args_dict = { 'program': program } @@ -591,6 +591,8 @@ args_dict['sourcePath'] = sourcePath if debuggerRoot: args_dict['debuggerRoot'] = debuggerRoot + if launchCommands: + args_dict['launchCommands'] = launchCommands command_dict = { 'command': 'launch', 'type': 'request', Index: lldb/trunk/tools/lldb-vscode/lldb-vscode.cpp =================================================================== --- lldb/trunk/tools/lldb-vscode/lldb-vscode.cpp +++ lldb/trunk/tools/lldb-vscode/lldb-vscode.cpp @@ -1182,6 +1182,7 @@ g_vsc.pre_run_commands = GetStrings(arguments, "preRunCommands"); g_vsc.stop_commands = GetStrings(arguments, "stopCommands"); g_vsc.exit_commands = GetStrings(arguments, "exitCommands"); + auto launchCommands = GetStrings(arguments, "launchCommands"); g_vsc.stop_at_entry = GetBoolean(arguments, "stopOnEntry", false); const auto debuggerRoot = GetString(arguments, "debuggerRoot"); @@ -1254,11 +1255,19 @@ // Run any pre run LLDB commands the user specified in the launch.json g_vsc.RunPreRunCommands(); + if (launchCommands.empty()) { + // Disable async events so the launch will be successful when we return from + // the launch call and the launch will happen synchronously + g_vsc.debugger.SetAsync(false); + g_vsc.target.Launch(g_vsc.launch_info, error); + g_vsc.debugger.SetAsync(true); + } else { + g_vsc.RunLLDBCommands("Running launchCommands:", launchCommands); + // The custom commands might have created a new target so we should use the + // selected target after these commands are run. + g_vsc.target = g_vsc.debugger.GetSelectedTarget(); + } - // Disable async events so the launch will be successful when we return from - // the launch call and the launch will happen synchronously - g_vsc.debugger.SetAsync(false); - g_vsc.target.Launch(g_vsc.launch_info, error); if (error.Fail()) { response["success"] = llvm::json::Value(false); EmplaceSafeString(response, "message", std::string(error.GetCString())); @@ -1268,7 +1277,7 @@ SendProcessEvent(Launch); g_vsc.SendJSON(llvm::json::Value(CreateEventObject("initialized"))); // Reenable async events and start the event thread to catch async events. - g_vsc.debugger.SetAsync(true); + // g_vsc.debugger.SetAsync(true); } // "NextRequest": {