diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/target_command')
6 files changed, 292 insertions, 0 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/target_command/Makefile b/packages/Python/lldbsuite/test/functionalities/target_command/Makefile new file mode 100644 index 0000000..9117ab9 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/target_command/Makefile @@ -0,0 +1,8 @@ +LEVEL = ../../make + +# Example: +# +# C_SOURCES := b.c +# EXE := b.out + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/functionalities/target_command/TestTargetCommand.py b/packages/Python/lldbsuite/test/functionalities/target_command/TestTargetCommand.py new file mode 100644 index 0000000..0ab965d --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/target_command/TestTargetCommand.py @@ -0,0 +1,201 @@ +""" +Test some target commands: create, list, select, variable. +""" + +from __future__ import print_function + + + +import lldb +import sys +from lldbsuite.test.lldbtest import * +import lldbsuite.test.lldbutil as lldbutil + +class targetCommandTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + # Find the line numbers for our breakpoints. + self.line_b = line_number('b.c', '// Set break point at this line.') + self.line_c = line_number('c.c', '// Set break point at this line.') + + def test_target_command(self): + """Test some target commands: create, list, select.""" + da = {'C_SOURCES': 'a.c', 'EXE': 'a.out'} + self.build(dictionary=da) + self.addTearDownCleanup(dictionary=da) + + db = {'C_SOURCES': 'b.c', 'EXE': 'b.out'} + self.build(dictionary=db) + self.addTearDownCleanup(dictionary=db) + + dc = {'C_SOURCES': 'c.c', 'EXE': 'c.out'} + self.build(dictionary=dc) + self.addTearDownCleanup(dictionary=dc) + + self.do_target_command() + + # rdar://problem/9763907 + # 'target variable' command fails if the target program has been run + @expectedFailureAndroid(archs=['aarch64']) + def test_target_variable_command(self): + """Test 'target variable' command before and after starting the inferior.""" + d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'} + self.build(dictionary=d) + self.addTearDownCleanup(dictionary=d) + + self.do_target_variable_command('globals') + + @expectedFailureAndroid(archs=['aarch64']) + def test_target_variable_command_no_fail(self): + """Test 'target variable' command before and after starting the inferior.""" + d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'} + self.build(dictionary=d) + self.addTearDownCleanup(dictionary=d) + + self.do_target_variable_command_no_fail('globals') + + def do_target_command(self): + """Exercise 'target create', 'target list', 'target select' commands.""" + exe_a = os.path.join(os.getcwd(), "a.out") + exe_b = os.path.join(os.getcwd(), "b.out") + exe_c = os.path.join(os.getcwd(), "c.out") + + self.runCmd("target list") + output = self.res.GetOutput() + if output.startswith("No targets"): + # We start from index 0. + base = 0 + else: + # Find the largest index of the existing list. + import re + pattern = re.compile("target #(\d+):") + for line in reversed(output.split(os.linesep)): + match = pattern.search(line) + if match: + # We will start from (index + 1) .... + base = int(match.group(1), 10) + 1 + #print("base is:", base) + break; + + self.runCmd("target create " + exe_a, CURRENT_EXECUTABLE_SET) + self.runCmd("run", RUN_SUCCEEDED) + + self.runCmd("target create " + exe_b, CURRENT_EXECUTABLE_SET) + lldbutil.run_break_set_by_file_and_line (self, 'b.c', self.line_b, num_expected_locations=1, loc_exact=True) + self.runCmd("run", RUN_SUCCEEDED) + + self.runCmd("target create " + exe_c, CURRENT_EXECUTABLE_SET) + lldbutil.run_break_set_by_file_and_line (self, 'c.c', self.line_c, num_expected_locations=1, loc_exact=True) + self.runCmd("run", RUN_SUCCEEDED) + + self.runCmd("target list") + + self.runCmd("target select %d" % base) + self.runCmd("thread backtrace") + + self.runCmd("target select %d" % (base + 2)) + self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT, + substrs = ['c.c:%d' % self.line_c, + 'stop reason = breakpoint']) + + self.runCmd("target select %d" % (base + 1)) + self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT, + substrs = ['b.c:%d' % self.line_b, + 'stop reason = breakpoint']) + + self.runCmd("target list") + + def do_target_variable_command(self, exe_name): + """Exercise 'target variable' command before and after starting the inferior.""" + self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET) + + self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["my_global_char", "'X'"]) + self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_global_str', '"abc"']) + self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_static_int', '228']) + self.expect("target variable my_global_str_ptr", matching=False, + substrs = ['"abc"']) + self.expect("target variable *my_global_str_ptr", matching=True, + substrs = ['"abc"']) + self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['a']) + + self.runCmd("b main") + self.runCmd("run") + + self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_global_str', '"abc"']) + self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_static_int', '228']) + self.expect("target variable my_global_str_ptr", matching=False, + substrs = ['"abc"']) + self.expect("target variable *my_global_str_ptr", matching=True, + substrs = ['"abc"']) + self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['a']) + self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["my_global_char", "'X'"]) + + self.runCmd("c") + + # rdar://problem/9763907 + # 'target variable' command fails if the target program has been run + self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_global_str', '"abc"']) + self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_static_int', '228']) + self.expect("target variable my_global_str_ptr", matching=False, + substrs = ['"abc"']) + self.expect("target variable *my_global_str_ptr", matching=True, + substrs = ['"abc"']) + self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['a']) + self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["my_global_char", "'X'"]) + + def do_target_variable_command_no_fail(self, exe_name): + """Exercise 'target variable' command before and after starting the inferior.""" + self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET) + + self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["my_global_char", "'X'"]) + self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_global_str', '"abc"']) + self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_static_int', '228']) + self.expect("target variable my_global_str_ptr", matching=False, + substrs = ['"abc"']) + self.expect("target variable *my_global_str_ptr", matching=True, + substrs = ['"abc"']) + self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['a']) + + self.runCmd("b main") + self.runCmd("run") + + # New feature: you don't need to specify the variable(s) to 'target vaiable'. + # It will find all the global and static variables in the current compile unit. + self.expect("target variable", + substrs = ['my_global_char', + 'my_global_str', + 'my_global_str_ptr', + 'my_static_int']) + + self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_global_str', '"abc"']) + self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['my_static_int', '228']) + self.expect("target variable my_global_str_ptr", matching=False, + substrs = ['"abc"']) + self.expect("target variable *my_global_str_ptr", matching=True, + substrs = ['"abc"']) + self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ['a']) + self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["my_global_char", "'X'"]) diff --git a/packages/Python/lldbsuite/test/functionalities/target_command/a.c b/packages/Python/lldbsuite/test/functionalities/target_command/a.c new file mode 100644 index 0000000..9d0706a --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/target_command/a.c @@ -0,0 +1,16 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> + +int main(int argc, const char* argv[]) +{ + int *null_ptr = 0; + printf("Hello, segfault!\n"); + printf("Now crash %d\n", *null_ptr); // Crash here. +} diff --git a/packages/Python/lldbsuite/test/functionalities/target_command/b.c b/packages/Python/lldbsuite/test/functionalities/target_command/b.c new file mode 100644 index 0000000..62ec97f --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/target_command/b.c @@ -0,0 +1,13 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +int main (int argc, char const *argv[]) +{ + return 0; // Set break point at this line. +} diff --git a/packages/Python/lldbsuite/test/functionalities/target_command/c.c b/packages/Python/lldbsuite/test/functionalities/target_command/c.c new file mode 100644 index 0000000..7c362cc --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/target_command/c.c @@ -0,0 +1,29 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> + +int main (int argc, char const *argv[]) +{ + enum days { + Monday = 10, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday, + kNumDays + }; + enum days day; + for (day = Monday - 1; day <= kNumDays + 1; day++) + { + printf("day as int is %i\n", (int)day); + } + return 0; // Set break point at this line. +} diff --git a/packages/Python/lldbsuite/test/functionalities/target_command/globals.c b/packages/Python/lldbsuite/test/functionalities/target_command/globals.c new file mode 100644 index 0000000..6902bc4 --- /dev/null +++ b/packages/Python/lldbsuite/test/functionalities/target_command/globals.c @@ -0,0 +1,25 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> + +char my_global_char = 'X'; +const char* my_global_str = "abc"; +const char **my_global_str_ptr = &my_global_str; +static int my_static_int = 228; + +int main (int argc, char const *argv[]) +{ + printf("global char: %c\n", my_global_char); + + printf("global str: %s\n", my_global_str); + + printf("argc + my_static_int = %d\n", (argc + my_static_int)); + + return 0; +} |