[Lldb-commits] [lldb] r128755 - in /lldb/trunk/utils/test: README-run-until-faulted main.c run-until-faulted.py

Johnny Chen johnny.chen at apple.com
Fri Apr 1 18:20:28 PDT 2011


Author: johnny
Date: Fri Apr  1 20:20:28 2011
New Revision: 128755

URL: http://llvm.org/viewvc/llvm-project?rev=128755&view=rev
Log:
Add a Python script which launches a program from within lldb and loop until the
process stops for some reason.  main.c (compiled into a.out) is used as an example in
the README-run-until-faulted file.

Added:
    lldb/trunk/utils/test/README-run-until-faulted
    lldb/trunk/utils/test/main.c
    lldb/trunk/utils/test/run-until-faulted.py   (with props)

Added: lldb/trunk/utils/test/README-run-until-faulted
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/utils/test/README-run-until-faulted?rev=128755&view=auto
==============================================================================
--- lldb/trunk/utils/test/README-run-until-faulted (added)
+++ lldb/trunk/utils/test/README-run-until-faulted Fri Apr  1 20:20:28 2011
@@ -0,0 +1,18 @@
+A example usage of the Python script run-until-faulted.py:
+
+[18:20:29] johnny:/Volumes/data/lldb/svn/trunk/utils/test $ ./run-until-faulted.py -l /Volumes/data/lldb/svn/trunk/build/Debug/lldb -e './a.out'
+lldb command: /Volumes/data/lldb/svn/trunk/build/Debug/lldb
+executable: ./a.out
+executable options: 
+sending file command....
+sending process launch --  (iteration: 0)
+
+* thread #1: tid = 0x2d03, 0x0000000100000eef a.out`main + 39 at main.c:7, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
+   4   	{
+   5   	    int *null_ptr = 0;
+   6   	    printf("Hello, fault!\n");
+-> 7   	    printf("Now segfault %d\n", *null_ptr);
+   8   	}
+
+(lldb) q
+[18:20:40] johnny:/Volumes/data/lldb/svn/trunk/utils/test $ 

Added: lldb/trunk/utils/test/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/utils/test/main.c?rev=128755&view=auto
==============================================================================
--- lldb/trunk/utils/test/main.c (added)
+++ lldb/trunk/utils/test/main.c Fri Apr  1 20:20:28 2011
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int main(int argc, const char* argv[])
+{
+    int *null_ptr = 0;
+    printf("Hello, fault!\n");
+    printf("Now segfault %d\n", *null_ptr);
+}

Added: lldb/trunk/utils/test/run-until-faulted.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/utils/test/run-until-faulted.py?rev=128755&view=auto
==============================================================================
--- lldb/trunk/utils/test/run-until-faulted.py (added)
+++ lldb/trunk/utils/test/run-until-faulted.py Fri Apr  1 20:20:28 2011
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+"""
+Run a program via lldb until it fails.
+The lldb executable is located via your PATH env variable, if not specified.
+"""
+
+import os
+import sys
+from optparse import OptionParser
+
+def is_exe(fpath):
+    """Check whether fpath is an executable."""
+    return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+
+def which(program):
+    """Find the full path to a program, or return None."""
+    fpath, fname = os.path.split(program)
+    if fpath:
+        if is_exe(program):
+            return program
+    else:
+        for path in os.environ["PATH"].split(os.pathsep):
+            exe_file = os.path.join(path, program)
+            if is_exe(exe_file):
+                return exe_file
+    return None
+
+def do_lldb_launch_loop(lldb_command, exe, exe_options):
+    from cStringIO import StringIO 
+    import pexpect, time
+
+    prompt = "\(lldb\) "
+    lldb = pexpect.spawn(lldb_command)
+    # Turn on logging for what lldb sends back.
+    #lldb.logfile_read = sys.stdout
+    lldb.expect(prompt)
+
+    # Now issue the file command.
+    print "sending file command...."
+    lldb.sendline('file %s' % exe)
+    lldb.expect(prompt)
+    #print "lldb.buffer:--->", lldb.buffer, "<---"
+    #print "lldb.before:--->", lldb.before, "<---"
+    #print "lldb.after:--->", lldb.buffer, "<----"
+
+    # Loop until it faults....
+    count = 0
+    #while True:
+    #    count = count + 1
+    for i in range(10):
+        count = i
+        print "sending process launch -- %s (iteration: %d)" % (exe_options, count)
+        lldb.sendline('process launch -- %s' % exe_options)
+        index = lldb.expect(['Process .* exited with status',
+                             'Process .* stopped',
+                             pexpect.TIMEOUT])
+        #print "lldb.buffer:--->", lldb.buffer, "<---"
+        #print "lldb.before:--->", lldb.before, "<----"
+        #print "lldb.after:--->", lldb.buffer, "<----"
+        if index == 0:
+            # We'll try again later.
+            time.sleep(3)
+        elif index == 1:
+            # Perfect, our process had stopped; break out of the loop.
+            break;
+        elif index == 2:
+            # Something went wrong.
+            print "TIMEOUT occurred:", str(lldb)        
+
+    # Give control of lldb shell to the user.
+    lldb.interact()
+
+def main():
+    # This is to set up the Python path to include the pexpect-2.4 dir.
+    # Remember to update this when/if things change.
+    scriptPath = sys.path[0]
+    sys.path.append(os.path.join(scriptPath, os.pardir, os.pardir, 'test', 'pexpect-2.4'))
+
+    parser = OptionParser(usage="""\
+Run a program via lldb until it fails.
+The lldb executable is located via your PATH env variable, if not specified.
+
+Usage: %prog [options]
+""")
+    parser.add_option('-l', '--lldb-command',
+                      type='string', action='store', metavar='LLDB_COMMAND',
+                      default='lldb', dest='lldb_command',
+                      help='Full path to your lldb command')
+    parser.add_option('-e', '--executable',
+                      type='string', action='store',
+                      dest='exe',
+                      help="""(Mandatory) The executable to launch via lldb.""")
+    parser.add_option('-o', '--options',
+                      type='string', action='store',
+                      default = '', dest='exe_options',
+                      help="""The args/options passed to the launched program, if specified.""")
+
+    opts, args = parser.parse_args()
+
+    lldb_command = which(opts.lldb_command)
+
+    if not opts.exe:
+        parser.print_help()
+        sys.exit(1)
+    exe = opts.exe
+
+    exe_options = opts.exe_options
+
+    # We have parsed the options.
+    print "lldb command:", lldb_command
+    print "executable:", exe
+    print "executable options:", exe_options
+
+    do_lldb_launch_loop(lldb_command, exe, exe_options)
+
+if __name__ == '__main__':
+    main()

Propchange: lldb/trunk/utils/test/run-until-faulted.py
------------------------------------------------------------------------------
    svn:executable = *





More information about the lldb-commits mailing list