diff --git a/examples/python/disasm.py b/examples/python/disasm.py
new file mode 100755
index 0000000..f6868e6
--- /dev/null
+++ b/examples/python/disasm.py
@@ -0,0 +1,79 @@
+#!/usr/bin/python
+
+#----------------------------------------------------------------------
+# Be sure to add the python path that points to the LLDB shared library.
+# On MacOSX csh, tcsh:
+#   setenv PYTHONPATH /Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python
+# On MacOSX sh, bash:
+#   export PYTHONPATH=/Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python
+#----------------------------------------------------------------------
+
+import lldb
+import os
+import sys
+import time
+
+def disassemble_instructions (insts):
+    for i in range(0, insts.GetSize()):
+        print insts.GetInstructionAtIndex(i)
+
+# Initialize LLDB so we can use it
+lldb.SBDebugger.Initialize()
+
+# Create a new debugger instance
+debugger = lldb.SBDebugger.Create()
+
+# When we step or continue, don't return from the function until the process 
+# stops. We do this by setting the async mode to false.
+debugger.SetAsync (False)
+
+# Create a target from a file and arch
+target = debugger.CreateTargetWithFileAndArch (sys.argv[1], "x86_64")
+
+if target.IsValid():
+    # If the target is valid set a breakpoint at main
+    main_bp = target.BreakpointCreateByName ("main", "a.out");
+    
+    # Launch the process. Since we specified synchronous mode, we won't return
+    # from this function until we hit the breakpoint at main
+    process = target.LaunchProcess (sys.argv[2:], [''], "dev/stdout", 0, False)
+    
+    # Make sure the launch went ok
+    if process.IsValid():
+        # Print some simple process info
+        print "process:", process, "\n"
+        # Get the first thread
+        thread = process.GetThreadAtIndex (0)
+        if thread.IsValid():
+            # Print some simple thread info
+            print "thread: ", thread
+            # Get the first frame
+            frame = thread.GetFrameAtIndex (0)
+            if frame.IsValid():
+                # Print some simple frame info
+                print "frame: ", frame
+                function = frame.GetFunction()
+                # See if we have debug info (a function)
+                if function.IsValid():
+                    # We do have a function, print some info for the function
+                    print "function: ", function, "\n"
+                    # Now get all instructions for this function and print them
+                    insts = function.GetInstructions(target)
+                    disassemble_instructions (insts)
+                else:
+                    # See if we have a symbol in the symbol table for where we stopped
+                    symbol = frame.GetSymbol();
+                    if symbol.IsValid():
+                        # We do have a symbol, print some info for the symbol
+                        print "symbol: ", symbol, "\n"
+                        # Now get all instructions for this symbol and print them
+                        insts = symbol.GetInstructions(target)
+                        disassemble_instructions (insts)
+        # Now continue to the program exit
+        process.Continue()
+        # When we return from the above function we will hopefully be at the
+        # program exit. Print out some process info
+        print "process:", process, "\n"
+        
+
+lldb.SBDebugger.Terminate()
