TestConvenienceVariables.py revision d7470c205e4f159a4e16937d0e0d31c069df6270
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer"""Test convenience variables when you drop in from lldb prompt into an embedded interpreter.""" 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeimport os 46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeimport unittest2 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattnerimport lldb 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattnerimport pexpect 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukmanfrom lldbtest import * 86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass ConvenienceVariablesCase(TestBase): 106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke mydir = os.path.join("functionalities", "embedded_interpreter") 1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson @dsym_test 159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson def test_with_dsym_and_run_command(self): 169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson """Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame.""" 176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.buildDsym() 186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.convenience_variables() 196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer @dwarf_test 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer @skipOnLinux # PR-14637: this test case fails sometimes because the input prompt "(lldb)" is missing 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer def test_with_dwarf_and_run_commands(self): 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer """Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame.""" 246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.buildDwarf() 256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.convenience_variables() 266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke def setUp(self): 286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke # Call super's setUp(). 296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke TestBase.setUp(self) 306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke # Find the line number to break on inside main.cpp. 316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.line = line_number('main.c', 'Hello world.') 32c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke def convenience_variables(self): 34c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer """Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame.""" 356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke exe = os.path.join(os.getcwd(), "a.out") 36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke prompt = "(lldb) " 37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke python_prompt = ">>> " 38c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer 39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke # So that the child gets torn down after the test. 40c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer self.child = pexpect.spawn('%s %s %s' % (self.lldbHere, self.lldbOption, exe)) 41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke child = self.child 42c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer # Turn on logging for what the child sends back. 43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke if self.TraceOn(): 446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.logfile_read = sys.stdout 45757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke 466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke # Set the breakpoint, run the inferior, when it breaks, issue print on 479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson # the various convenience variables. 489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.expect_exact(prompt) 499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.sendline('breakpoint set -f main.c -l %d' % self.line) 509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.expect_exact(prompt) 519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.sendline('run') 529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.expect_exact(prompt) 539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.sendline('script') 549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.expect_exact(python_prompt) 559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson # Set a flag so that we know during teardown time, we need to exit the 579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson # Python interpreter, then the lldb interpreter. 589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson self.child_in_script_interpreter = True 599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.sendline('print lldb.debugger') 619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.expect_exact(python_prompt) 626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.expect(child.before, exe=False, 639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson patterns = ['Debugger \(instance: .*, id: \d\)']) 646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.sendline('print lldb.target') 666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.expect_exact(python_prompt) 676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.expect(child.before, exe=False, 686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke substrs = ['a.out']) 696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.sendline('print lldb.process') 716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.expect_exact(python_prompt) 726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.expect(child.before, exe=False, 736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke patterns = ['SBProcess: pid = \d+, state = stopped, threads = \d, executable = a.out']) 746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.sendline('print lldb.thread') 766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke child.expect_exact(python_prompt) 77fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson self.expect(child.before, exe=False, 78314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson patterns = ['SBThread: tid = 0x[0-9a-f]+']) 796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.sendline('print lldb.frame') 819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson child.expect_exact(python_prompt) 826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke self.expect(child.before, exe=False, 836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke substrs = ['frame #0', 'main.c:%d' % self.line]) 84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 86e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaekeif __name__ == '__main__': 879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson import atexit 88c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer lldb.SBDebugger.Initialize() 89c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer atexit.register(lambda: lldb.SBDebugger.Terminate()) 90c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer unittest2.main() 91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke