[Lldb-commits] [lldb] r127519 - in /lldb/trunk/test: lldbtest.py stop-hook/ stop-hook/Makefile stop-hook/TestStopHook.py stop-hook/main.cpp

Johnny Chen johnny.chen at apple.com
Fri Mar 11 17:18:19 PST 2011


Author: johnny
Date: Fri Mar 11 19:18:19 2011
New Revision: 127519

URL: http://llvm.org/viewvc/llvm-project?rev=127519&view=rev
Log:
Add a test directory stop-hook to test the newly added "target stop-hook" command.
This uses pexpect module to spawn a 'lldb' program and uses pseudo-TTY to talk to
the child application.

The test cases test setting breakpoints, adding a stop-hook with line range, and
verifies that when the inferior stops, the stop-hook will fire off when it is
within range and will not fire off when it is out of range.

Added:
    lldb/trunk/test/stop-hook/
    lldb/trunk/test/stop-hook/Makefile
    lldb/trunk/test/stop-hook/TestStopHook.py
    lldb/trunk/test/stop-hook/main.cpp
Modified:
    lldb/trunk/test/lldbtest.py

Modified: lldb/trunk/test/lldbtest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lldbtest.py?rev=127519&r1=127518&r2=127519&view=diff
==============================================================================
--- lldb/trunk/test/lldbtest.py (original)
+++ lldb/trunk/test/lldbtest.py Fri Mar 11 19:18:19 2011
@@ -523,6 +523,10 @@
         # We want our debugger to be synchronous.
         self.dbg.SetAsync(False)
 
+        # This is for the case of directly spawning 'lldb' and interacting with it
+        # using pexpect.
+        self.child = None
+
         # There is no process associated with the debugger as yet.
         # See also self.tearDown() where it checks whether self.process has a
         # valid reference and calls self.process.Kill() to kill the process.
@@ -658,6 +662,12 @@
                 print >> sbuf, "Executing tearDown hook:", getsource_if_available(hook)
             hook()
 
+        # This is for the case of directly spawning 'lldb' and interacting with it
+        # using pexpect.
+        if self.child and self.child.isalive():
+            self.child.sendline('quit')
+            self.child.close()
+
         # Terminate the current process being debugged, if any.
         if self.runStarted:
             self.runCmd("process kill", PROCESS_KILLED, check=False)
@@ -916,3 +926,9 @@
         err.write('\t' + "IsPointerType -> " + str(val.TypeIsPointerType()) + '\n')
         err.write('\t' + "Location      -> " + val.GetLocation(frame)       + '\n')
 
+    def DebugPExpect(self, child):
+        """Debug the spwaned pexpect object."""
+        if not traceAlways:
+            return
+
+        print child

Added: lldb/trunk/test/stop-hook/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/stop-hook/Makefile?rev=127519&view=auto
==============================================================================
--- lldb/trunk/test/stop-hook/Makefile (added)
+++ lldb/trunk/test/stop-hook/Makefile Fri Mar 11 19:18:19 2011
@@ -0,0 +1,5 @@
+LEVEL = ../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/test/stop-hook/TestStopHook.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/stop-hook/TestStopHook.py?rev=127519&view=auto
==============================================================================
--- lldb/trunk/test/stop-hook/TestStopHook.py (added)
+++ lldb/trunk/test/stop-hook/TestStopHook.py Fri Mar 11 19:18:19 2011
@@ -0,0 +1,88 @@
+"""
+Test lldb target stop-hook command.
+"""
+
+import os
+import unittest2
+import lldb
+import pexpect
+from lldbtest import *
+
+class StopHookTestCase(TestBase):
+
+    mydir = "stop-hook"
+
+    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
+    def test_with_dsym(self):
+        """Test a sequence of target add-hook commands."""
+        self.buildDsym()
+        self.stop_hook_command_sequence()
+
+    def test_with_dwarf(self):
+        """Test a sequence of target add-hook commands."""
+        self.buildDwarf()
+        self.stop_hook_command_sequence()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+        # Find the line numbers inside main.cpp.
+        self.begl = line_number('main.cpp', '// Set breakpoint here to test target stop-hook.')
+        self.endl = line_number('main.cpp', '// End of the line range for which stop-hook is to be run.')
+        self.line = line_number('main.cpp', '// Another breakpoint which is outside of the stop-hook range.')
+
+    def stop_hook_command_sequence(self):
+        """Test a sequence of target stop-hook commands."""
+        exe = os.path.join(os.getcwd(), "a.out")
+        prompt = "\r\n\(lldb\) "
+        add_prompt = "Enter your stop hook command\(s\).  Type 'DONE' to end.\r\n> "
+        add_prompt1 = "\r\n> "
+
+        child = pexpect.spawn('%s %s' % (self.lldbExec, exe))
+        # Turn on logging for what the child sends back.
+        if traceAlways:
+            child.logfile_read = sys.stdout
+
+        # Set the breakpoint, followed by the target stop-hook commands.
+        child.expect(prompt)
+        child.sendline('breakpoint set -f main.cpp -l %d' % self.begl)
+        child.expect(prompt)
+        child.sendline('breakpoint set -f main.cpp -l %d' % self.line)
+        child.expect(prompt)
+        child.sendline('target stop-hook add -f main.cpp -l %d -e %d' % (self.begl, self.endl))
+        child.expect(add_prompt)
+        child.sendline('expr ptr')
+        child.expect(add_prompt1)
+        child.sendline('DONE')
+        child.expect(prompt)
+        child.sendline('target stop-hook list')
+
+        # Now run the program, expect to stop at the the first breakpoint which is within the stop-hook range.
+        child.expect(prompt)
+        child.sendline('run')
+        child.expect(prompt)
+        self.DebugPExpect(child)
+        child.sendline('thread step-over')
+        child.expect(prompt)
+        self.DebugPExpect(child)
+        # Verify that the 'Stop Hooks' mechanism is fired off.
+        self.expect(child.before, exe=False,
+            substrs = ['Stop Hooks'])
+
+        # Now continue the inferior, we'll stop at another breakpoint which is outside the stop-hook range.
+        child.sendline('process continue')
+        child.expect(prompt)
+        self.DebugPExpect(child)
+        child.sendline('thread step-over')
+        child.expect(prompt)
+        self.DebugPExpect(child)
+        # Verify that the 'Stop Hooks' mechanism is NOT BEING fired off.
+        self.expect(child.before, exe=False, matching=False,
+            substrs = ['Stop Hooks'])
+        
+
+if __name__ == '__main__':
+    import atexit
+    lldb.SBDebugger.Initialize()
+    atexit.register(lambda: lldb.SBDebugger.Terminate())
+    unittest2.main()

Added: lldb/trunk/test/stop-hook/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/stop-hook/main.cpp?rev=127519&view=auto
==============================================================================
--- lldb/trunk/test/stop-hook/main.cpp (added)
+++ lldb/trunk/test/stop-hook/main.cpp Fri Mar 11 19:18:19 2011
@@ -0,0 +1,54 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+#include <stdlib.h>
+
+int a(int);
+int b(int);
+int c(int);
+
+int a(int val)
+{
+    if (val <= 1)
+        return b(val);
+    else if (val >= 3)
+        return c(val);
+
+    return val;
+}
+
+int b(int val)
+{
+    int rc = c(val);
+    void *ptr = malloc(1024);
+    if (!ptr)  // Set breakpoint here to test target stop-hook.
+        return -1;
+    else
+        printf("ptr=%p\n", ptr);
+    return rc; // End of the line range for which stop-hook is to be run.
+}
+
+int c(int val)
+{
+    return val + 3;
+}
+
+int main (int argc, char const *argv[])
+{
+    int A1 = a(1);
+    printf("a(1) returns %d\n", A1);
+    
+    int B2 = b(2); // Another breakpoint which is outside of the stop-hook range.
+    printf("b(2) returns %d\n", B2);
+    
+    int A3 = a(3);
+    printf("a(3) returns %d\n", A3);
+    
+    return 0;
+}





More information about the lldb-commits mailing list