summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Langford <apl@fb.com>2019-08-19 20:17:27 +0000
committerAlex Langford <apl@fb.com>2019-08-19 20:17:27 +0000
commit27408f5636fdf01cafbab4db40055102bc1fbfa2 (patch)
treeb3ff995d9a8e97dfe06be074dcbb1a5febfd0acd
parentd9d9c2806f8f769443b77b6f97c571510380b78b (diff)
[lldb-vscode] add `launchCommands` to handle launch specific commands
Summary: This can help `lldb-vscode` handle launch commands associate with remote platform attach request have field `attachCommands` to handle attach specific commands add a corresponding one for launch request if no launch command is provided, create a new target and launch; otherwise, execute the launch command Differential Revision: https://reviews.llvm.org/D65363 Patch by Wanyi Ye <kusmour@gmail.com> git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@369296 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py65
-rw-r--r--packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py41
-rw-r--r--packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py4
-rw-r--r--tools/lldb-vscode/lldb-vscode.cpp19
4 files changed, 110 insertions, 19 deletions
diff --git a/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py b/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py
index bfd8ed702..dc7635289 100644
--- a/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py
+++ b/packages/Python/lldbsuite/test/tools/lldb-vscode/launch/TestVSCode_launch.py
@@ -341,3 +341,68 @@ class TestVSCode_launch(lldbvscode_testcase.VSCodeTestCaseBase):
# "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)
diff --git a/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py b/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
index 662a05708..cff85346d 100644
--- a/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
+++ b/packages/Python/lldbsuite/test/tools/lldb-vscode/lldbvscode_testcase.py
@@ -245,20 +245,17 @@ class VSCodeTestCaseBase(TestBase):
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 @@ class VSCodeTestCaseBase(TestBase):
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)
diff --git a/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py b/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py
index 638c038e1..b4e219894 100644
--- a/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py
+++ b/packages/Python/lldbsuite/test/tools/lldb-vscode/vscode.py
@@ -558,7 +558,7 @@ class DebugCommunication(object):
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 @@ class DebugCommunication(object):
args_dict['sourcePath'] = sourcePath
if debuggerRoot:
args_dict['debuggerRoot'] = debuggerRoot
+ if launchCommands:
+ args_dict['launchCommands'] = launchCommands
command_dict = {
'command': 'launch',
'type': 'request',
diff --git a/tools/lldb-vscode/lldb-vscode.cpp b/tools/lldb-vscode/lldb-vscode.cpp
index 57d218c23..2810da62f 100644
--- a/tools/lldb-vscode/lldb-vscode.cpp
+++ b/tools/lldb-vscode/lldb-vscode.cpp
@@ -1182,6 +1182,7 @@ void request_launch(const llvm::json::Object &request) {
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 @@ void request_launch(const llvm::json::Object &request) {
// 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 @@ void request_launch(const llvm::json::Object &request) {
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": {