| """ |
| Test lldb breakpoint command for CPP methods & functions in a namespace. |
| """ |
| |
| import os, time |
| import unittest2 |
| import lldb |
| from lldbtest import * |
| |
| class CPPBreakpointTestCase(TestBase): |
| |
| mydir = os.path.join("lang", "cpp", "breakpoints") |
| |
| @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") |
| @dsym_test |
| def test_with_dsym(self): |
| """Test a sequence of breakpoint command add, list, and delete.""" |
| self.buildDsym() |
| self.cpp_breakpoints() |
| |
| @dwarf_test |
| def test_with_dwarf(self): |
| """Test a sequence of breakpoint command add, list, and delete.""" |
| self.buildDwarf() |
| self.cpp_breakpoints() |
| |
| def setUp(self): |
| # Call super's setUp(). |
| TestBase.setUp(self) |
| |
| def cpp_breakpoints (self): |
| """Test a sequence of breakpoint command add, list, and delete.""" |
| exe = os.path.join(os.getcwd(), "a.out") |
| |
| # Create a target from the debugger. |
| |
| target = self.dbg.CreateTarget (exe) |
| self.assertTrue(target, VALID_TARGET) |
| |
| a_out_module = lldb.SBFileSpecList() |
| a_out_module.Append(lldb.SBFileSpec(exe)) |
| |
| nested_comp_unit = lldb.SBFileSpecList() |
| nested_comp_unit.Append (lldb.SBFileSpec("nested.cpp")) |
| |
| # First provide ONLY the method name. This should get everybody... |
| auto_break = target.BreakpointCreateByName ("Function", |
| lldb.eFunctionNameTypeAuto, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (auto_break.GetNumLocations() == 5) |
| |
| # Now add the Baz class specifier. This should get the version contained in Bar, |
| # AND the one contained in :: |
| auto_break = target.BreakpointCreateByName ("Baz::Function", |
| lldb.eFunctionNameTypeAuto, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (auto_break.GetNumLocations() == 2) |
| |
| # Then add the Bar::Baz specifier. This should get the version contained in Bar only |
| auto_break = target.BreakpointCreateByName ("Bar::Baz::Function", |
| lldb.eFunctionNameTypeAuto, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (auto_break.GetNumLocations() == 1) |
| |
| plain_method_break = target.BreakpointCreateByName ("Function", |
| lldb.eFunctionNameTypeMethod, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (plain_method_break.GetNumLocations() == 3) |
| |
| plain_method_break = target.BreakpointCreateByName ("Baz::Function", |
| lldb.eFunctionNameTypeMethod, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (plain_method_break.GetNumLocations() == 2) |
| |
| plain_method_break = target.BreakpointCreateByName ("Bar::Baz::Function", |
| lldb.eFunctionNameTypeMethod, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (plain_method_break.GetNumLocations() == 1) |
| |
| plain_method_break = target.BreakpointCreateByName ("Function", |
| lldb.eFunctionNameTypeBase, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (plain_method_break.GetNumLocations() == 2) |
| |
| plain_method_break = target.BreakpointCreateByName ("Bar::Function", |
| lldb.eFunctionNameTypeBase, |
| a_out_module, |
| nested_comp_unit) |
| self.assertTrue (plain_method_break.GetNumLocations() == 1) |
| |
| |
| |
| if __name__ == '__main__': |
| import atexit |
| lldb.SBDebugger.Initialize() |
| atexit.register(lambda: lldb.SBDebugger.Terminate()) |
| unittest2.main() |