Fix malloc thread step-out test on FreeBSD
authorEd Maste <emaste@freebsd.org>
Fri, 7 Mar 2014 19:02:20 +0000 (19:02 +0000)
committerEd Maste <emaste@freebsd.org>
Fri, 7 Mar 2014 19:02:20 +0000 (19:02 +0000)
After hitting the malloc() breakpoint on FreeBSD our top frame is actually
an inlined function malloc_init.

  * frame #0: 0x0000000800dcba19 libc.so.7`malloc [inlined] malloc_init at malloc.c:5397
    frame #1: 0x0000000800dcba19 libc.so.7`malloc(size=1024) + 9 at malloc.c:5949
    frame #2: 0x00000000004006e5 test_step_out_of_malloc_into_function_b_with_dwarf`b(val=1) + 37 at main2.cpp:29

Add a heuristic to keep stepping out until we come to a non-malloc caller,
before checking if it is our desired caller from the test code.

llvm.org/pr17944

llvm-svn: 203268

lldb/test/python_api/thread/TestThreadAPI.py

index a04def9..1dc8d83 100644 (file)
@@ -74,7 +74,6 @@ class ThreadAPITestCase(TestBase):
         self.setTearDownCleanup(dictionary=d)
         self.step_out_of_malloc_into_function_b(self.exe_name)
 
-    @expectedFailureFreeBSD('llvm.org/pr17944')
     @expectedFailureLinux # llvm.org/pr14416
     @python_api_test
     @dwarf_test
@@ -187,6 +186,15 @@ class ThreadAPITestCase(TestBase):
             #print "caller symbol of malloc:", caller_symbol
             if not caller_symbol:
                 self.fail("Test failed: could not locate the caller symbol of malloc")
+
+            # Our top frame may be an inlined function in malloc() (e.g., on
+            # FreeBSD).  Apply a simple heuristic of stepping out until we find
+            # a non-malloc caller
+            while caller_symbol.startswith("malloc"):
+                thread.StepOut()
+                self.assertTrue(thread.IsValid(), "Thread valid after stepping to outer malloc")
+                caller_symbol = get_caller_symbol(thread)
+
             if caller_symbol == "b(int)":
                 break
             #self.runCmd("thread backtrace")