| """ | |
| Test some target commands: create, list, select, variable. | |
| """ | |
| import unittest2 | |
| import lldb | |
| import sys | |
| from lldbtest import * | |
| import 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.') | |
| @dwarf_test | |
| def test_target_command_with_dwarf(self): | |
| """Test some target commands: create, list, select.""" | |
| da = {'C_SOURCES': 'a.c', 'EXE': 'a.out'} | |
| self.buildDwarf(dictionary=da) | |
| self.addTearDownCleanup(dictionary=da) | |
| db = {'C_SOURCES': 'b.c', 'EXE': 'b.out'} | |
| self.buildDwarf(dictionary=db) | |
| self.addTearDownCleanup(dictionary=db) | |
| dc = {'C_SOURCES': 'c.c', 'EXE': 'c.out'} | |
| self.buildDwarf(dictionary=dc) | |
| self.addTearDownCleanup(dictionary=dc) | |
| self.do_target_command() | |
| # rdar://problem/9763907 | |
| # 'target variable' command fails if the target program has been run | |
| @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") | |
| @dsym_test | |
| def test_target_variable_command_with_dsym(self): | |
| """Test 'target variable' command before and after starting the inferior.""" | |
| d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'} | |
| self.buildDsym(dictionary=d) | |
| self.addTearDownCleanup(dictionary=d) | |
| self.do_target_variable_command('globals') | |
| @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") | |
| @dsym_test | |
| def test_target_variable_command_with_dsym_no_fail(self): | |
| """Test 'target variable' command before and after starting the inferior.""" | |
| d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'} | |
| self.buildDsym(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'"]) | |
| if __name__ == '__main__': | |
| import atexit | |
| lldb.SBDebugger.Initialize() | |
| atexit.register(lambda: lldb.SBDebugger.Terminate()) | |
| unittest2.main() |