| """ |
| Test the lldb disassemble command on foundation framework. |
| """ |
| |
| import os |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class FoundationDisassembleTestCase(TestBase): |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| @skipIfAsan |
| def test_simple_disasm(self): |
| """Test the lldb 'disassemble' command""" |
| self.build() |
| |
| # Create a target by the debugger. |
| target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) |
| self.assertTrue(target, VALID_TARGET) |
| |
| # Stop at +[NSString stringWithFormat:]. |
| symbol_name = "+[NSString stringWithFormat:]" |
| break_results = lldbutil.run_break_set_command( |
| self, "_regexp-break %s" % (symbol_name) |
| ) |
| |
| lldbutil.check_breakpoint_result( |
| self, break_results, symbol_name=symbol_name, num_locations=1 |
| ) |
| |
| # Stop at -[MyString initWithNSString:]. |
| lldbutil.run_break_set_by_symbol( |
| self, |
| "-[MyString initWithNSString:]", |
| num_expected_locations=1, |
| sym_exact=True, |
| ) |
| |
| # Stop at the "description" selector. |
| lldbutil.run_break_set_by_selector( |
| self, "description", num_expected_locations=1, module_name="a.out" |
| ) |
| |
| # Stop at -[NSAutoreleasePool release]. |
| break_results = lldbutil.run_break_set_command( |
| self, "_regexp-break -[NSAutoreleasePool release]" |
| ) |
| lldbutil.check_breakpoint_result( |
| self, |
| break_results, |
| symbol_name="-[NSAutoreleasePool release]", |
| num_locations=1, |
| ) |
| |
| self.runCmd("run", RUN_SUCCEEDED) |
| |
| # First stop is +[NSString stringWithFormat:]. |
| self.expect( |
| "thread backtrace", |
| "Stop at +[NSString stringWithFormat:]", |
| substrs=["Foundation`+[NSString stringWithFormat:]"], |
| ) |
| |
| # Do the disassemble for the currently stopped function. |
| self.runCmd("disassemble -f") |
| |
| self.runCmd("process continue") |
| # Skip another breakpoint for +[NSString stringWithFormat:]. |
| self.runCmd("process continue") |
| |
| # Followed by a.out`-[MyString initWithNSString:]. |
| self.expect( |
| "thread backtrace", |
| "Stop at a.out`-[MyString initWithNSString:]", |
| substrs=["a.out`-[MyString initWithNSString:]"], |
| ) |
| |
| # Do the disassemble for the currently stopped function. |
| self.runCmd("disassemble -f") |
| |
| self.runCmd("process continue") |
| |
| # Followed by -[MyString description]. |
| self.expect( |
| "thread backtrace", |
| "Stop at -[MyString description]", |
| substrs=["a.out`-[MyString description]"], |
| ) |
| |
| # Do the disassemble for the currently stopped function. |
| self.runCmd("disassemble -f") |
| |
| self.runCmd("process continue") |
| # Skip another breakpoint for -[MyString description]. |
| self.runCmd("process continue") |
| |
| # Followed by -[NSAutoreleasePool release]. |
| self.expect( |
| "thread backtrace", |
| "Stop at -[NSAutoreleasePool release]", |
| substrs=["Foundation`-[NSAutoreleasePool release]"], |
| ) |
| |
| # Do the disassemble for the currently stopped function. |
| self.runCmd("disassemble -f") |