From 8f192cea00df7865da1aab672344c4091676641e Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Fri, 9 Dec 2011 00:58:33 +0000 Subject: [PATCH] We now have a test case for stopping within a module in a place where the translation unit has a interface for a class "Bar" that contains hidden ivars in the implementation and we make sure we can see these hidden ivars. We also test the case where we stop in translation unit that contains the implementation first. So the test runs two tests: 1 - run and stop where we have an interface, run to main and print and make sure we find the hidden ivar 2 - run and stop where we have an implementation, run to main and print and make sure we find the hidden ivar llvm-svn: 146216 --- lldb/test/lang/objc/real-definition/Bar.m | 2 +- lldb/test/lang/objc/real-definition/Foo.m | 2 +- .../real-definition/TestRealDefinition.py | 102 ++++++++++++++++++ lldb/test/lang/objc/real-definition/main.m | 2 +- 4 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 lldb/test/lang/objc/real-definition/TestRealDefinition.py diff --git a/lldb/test/lang/objc/real-definition/Bar.m b/lldb/test/lang/objc/real-definition/Bar.m index 4b8503194c87..46d7e3888751 100644 --- a/lldb/test/lang/objc/real-definition/Bar.m +++ b/lldb/test/lang/objc/real-definition/Bar.m @@ -25,7 +25,7 @@ if (self) { _hidden_ivar = [NSString stringWithFormat:@"%p: @Bar", self]; } - return self; + return self; // Set breakpoint where Bar is an implementation } - (void)dealloc diff --git a/lldb/test/lang/objc/real-definition/Foo.m b/lldb/test/lang/objc/real-definition/Foo.m index 0a3ff832ddd1..bcdeaeffc29a 100644 --- a/lldb/test/lang/objc/real-definition/Foo.m +++ b/lldb/test/lang/objc/real-definition/Foo.m @@ -8,7 +8,7 @@ if (self) { _bar = [[Bar alloc] init]; } - return self; + return self; // Set breakpoint where Bar is an interface } - (void)dealloc diff --git a/lldb/test/lang/objc/real-definition/TestRealDefinition.py b/lldb/test/lang/objc/real-definition/TestRealDefinition.py new file mode 100644 index 000000000000..e47b229c8a51 --- /dev/null +++ b/lldb/test/lang/objc/real-definition/TestRealDefinition.py @@ -0,0 +1,102 @@ +"""Test that types defined in shared libraries work correctly.""" + +import os, time +import unittest2 +import lldb +from lldbtest import * + +class TestRealDefinition(TestBase): + + mydir = os.path.join("lang", "objc", "real-definition") + + def test_expr_with_dsym(self): + """Test that we can find the implementation for an objective C type""" + self.buildDsym() + self.stop_at_interface() + + def test_expr_with_dwarf(self): + """Test that we can find the implementation for an objective C type""" + self.buildDwarf() + self.stop_at_interface() + + def test_frame_variable_with_dsym(self): + """Test that we can find the implementation for an objective C type""" + self.buildDsym() + self.stop_at_implementation() + + def test_frame_variable_with_dwarf(self): + """Test that we can find the implementation for an objective C type""" + self.buildDwarf() + self.stop_at_implementation() + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + + def common_setup(self): + exe = os.path.join(os.getcwd(), "a.out") + self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) + + # Break inside the foo function which takes a bar_ptr argument. + self.expect("breakpoint set -f main.m -l %d" % line_number('main.m', '// Set breakpoint in main'), BREAKPOINT_CREATED, startstr = "Breakpoint created") + + def stop_at_interface(self): + """Test that we can find the implementation for an objective C type when we stop in the interface""" + self.common_setup() + + self.expect("breakpoint set -f Foo.m -l %d" % line_number('Foo.m', '// Set breakpoint where Bar is an interface'), BREAKPOINT_CREATED, startstr = "Breakpoint created") + + self.runCmd("run", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs = ['stopped', + 'stop reason = breakpoint']) + + # Run and stop at Foo + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs = [' resolved, hit count = 1']) + + self.runCmd("continue", RUN_SUCCEEDED) + + # Run at stop at main + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs = [' resolved, hit count = 1']) + + # This should display correctly. + self.expect("frame variable foo->_bar->_hidden_ivar", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["(NSString *)", "foo->_bar->_hidden_ivar = 0x"]) + + def stop_at_implementation(self): + """Test that we can find the implementation for an objective C type when we stop in the implementation""" + self.common_setup() + + self.expect("breakpoint set -f Bar.m -l %d" % line_number('Bar.m', '// Set breakpoint where Bar is an implementation'), BREAKPOINT_CREATED, startstr = "Breakpoint created") + + self.runCmd("run", RUN_SUCCEEDED) + + # The stop reason of the thread should be breakpoint. + self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, + substrs = ['stopped', + 'stop reason = breakpoint']) + + # Run and stop at Foo + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs = [' resolved, hit count = 1']) + + self.runCmd("continue", RUN_SUCCEEDED) + + # Run at stop at main + self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, + substrs = [' resolved, hit count = 1']) + + # This should display correctly. + self.expect("frame variable foo->_bar->_hidden_ivar", VARIABLES_DISPLAYED_CORRECTLY, + substrs = ["(NSString *)", "foo->_bar->_hidden_ivar = 0x"]) + + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() diff --git a/lldb/test/lang/objc/real-definition/main.m b/lldb/test/lang/objc/real-definition/main.m index c5371cf86f78..8c31dc9abb31 100644 --- a/lldb/test/lang/objc/real-definition/main.m +++ b/lldb/test/lang/objc/real-definition/main.m @@ -7,7 +7,7 @@ int main (int argc, char const *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Foo *foo = [[Foo alloc] init]; - NSLog (@"foo is %@", foo); + NSLog (@"foo is %@", foo); // Set breakpoint in main [pool release]; return 0; }