returns a print friendly stack trace at the current frame,
    without aborting the application.
    
    :param depth: The depth of the stack trace. if omitted, the entire
        stack will be printed.
    
    usage::
    
        print stack_trace(10)

def stack_trace(depth=None):
    """
    returns a print friendly stack trace at the current frame,
    without aborting the application.
    
    :param depth: The depth of the stack trace. if omitted, the entire
        stack will be printed.
    
    usage::
    
        print stack_trace(10)
    """
    frames = inspect.stack()[2:]
    if depth:
        frames = frames[:depth]
        
    result = StringIO()
    result.write("----------------------------------------------------\n")
    for (frame, file, line, context, code, status) in frames:
        result.write("In %s from %s\n%s %s" % (context, file, line, "\n".join(code)))
        result.write("----------------------------------------------------\n")        
    return result.getvalue()