Merge pull request #2343 from krafczyk/features/better_diagnostics
Improve diagnostics to ease debugging
This commit is contained in:
		@@ -128,6 +128,8 @@ parser.add_argument('-p', '--profile', action='store_true',
 | 
			
		||||
                    help="Profile execution using cProfile.")
 | 
			
		||||
parser.add_argument('-v', '--verbose', action='store_true',
 | 
			
		||||
                    help="Print additional output during builds")
 | 
			
		||||
parser.add_argument('-s', '--stacktrace', action='store_true',
 | 
			
		||||
                    help="Add stacktrace information to all printed statements")
 | 
			
		||||
parser.add_argument('-V', '--version', action='version',
 | 
			
		||||
                    version="%s" % spack.spack_version)
 | 
			
		||||
 | 
			
		||||
@@ -155,6 +157,7 @@ def main():
 | 
			
		||||
    # Set up environment based on args.
 | 
			
		||||
    tty.set_verbose(args.verbose)
 | 
			
		||||
    tty.set_debug(args.debug)
 | 
			
		||||
    tty.set_stacktrace(args.stacktrace)
 | 
			
		||||
    spack.debug = args.debug
 | 
			
		||||
 | 
			
		||||
    if spack.debug:
 | 
			
		||||
 
 | 
			
		||||
@@ -28,12 +28,14 @@
 | 
			
		||||
import fcntl
 | 
			
		||||
import termios
 | 
			
		||||
import struct
 | 
			
		||||
import traceback
 | 
			
		||||
from StringIO import StringIO
 | 
			
		||||
 | 
			
		||||
from llnl.util.tty.color import *
 | 
			
		||||
 | 
			
		||||
_debug   = False
 | 
			
		||||
_verbose = False
 | 
			
		||||
_stacktrace = False
 | 
			
		||||
indent  = "  "
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -45,6 +47,10 @@ def is_debug():
 | 
			
		||||
    return _debug
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def is_stacktrace():
 | 
			
		||||
    return _stacktrace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def set_debug(flag):
 | 
			
		||||
    global _debug
 | 
			
		||||
    _debug = flag
 | 
			
		||||
@@ -55,8 +61,33 @@ def set_verbose(flag):
 | 
			
		||||
    _verbose = flag
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
def set_stacktrace(flag):
 | 
			
		||||
    global _stacktrace
 | 
			
		||||
    _stacktrace = flag
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def process_stacktrace(countback):
 | 
			
		||||
    """Gives file and line frame 'countback' frames from the bottom"""
 | 
			
		||||
    st = traceback.extract_stack()
 | 
			
		||||
    # Not all entries may be spack files, we have to remove those that aren't.
 | 
			
		||||
    file_list = []
 | 
			
		||||
    for frame in st:
 | 
			
		||||
        # Check that the file is a spack file
 | 
			
		||||
        if frame[0].find("/spack") >= 0:
 | 
			
		||||
            file_list.append(frame[0])
 | 
			
		||||
    # We use commonprefix to find what the spack 'root' directory is.
 | 
			
		||||
    root_dir = os.path.commonprefix(file_list)
 | 
			
		||||
    root_len = len(root_dir)
 | 
			
		||||
    st_idx = len(st) - countback - 1
 | 
			
		||||
    st_text = "%s:%i " % (st[st_idx][0][root_len:], st[st_idx][1])
 | 
			
		||||
    return st_text
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def msg(message, *args):
 | 
			
		||||
    cprint("@*b{==>} %s" % cescape(message))
 | 
			
		||||
    st_text = ""
 | 
			
		||||
    if _stacktrace:
 | 
			
		||||
        st_text = process_stacktrace(2)
 | 
			
		||||
    cprint("@*b{%s==>} %s" % (st_text, cescape(message)))
 | 
			
		||||
    for arg in args:
 | 
			
		||||
        print indent + str(arg)
 | 
			
		||||
 | 
			
		||||
@@ -66,8 +97,13 @@ def info(message, *args, **kwargs):
 | 
			
		||||
    stream = kwargs.get('stream', sys.stdout)
 | 
			
		||||
    wrap   = kwargs.get('wrap', False)
 | 
			
		||||
    break_long_words = kwargs.get('break_long_words', False)
 | 
			
		||||
    st_countback = kwargs.get('countback', 3)
 | 
			
		||||
 | 
			
		||||
    cprint("@%s{==>} %s" % (format, cescape(str(message))), stream=stream)
 | 
			
		||||
    st_text = ""
 | 
			
		||||
    if _stacktrace:
 | 
			
		||||
        st_text = process_stacktrace(st_countback)
 | 
			
		||||
    cprint("@%s{%s==>} %s" % (format, st_text, cescape(str(message))),
 | 
			
		||||
           stream=stream)
 | 
			
		||||
    for arg in args:
 | 
			
		||||
        if wrap:
 | 
			
		||||
            lines = textwrap.wrap(
 | 
			
		||||
@@ -105,6 +141,7 @@ def warn(message, *args, **kwargs):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def die(message, *args, **kwargs):
 | 
			
		||||
    kwargs.setdefault('countback', 4)
 | 
			
		||||
    error(message, *args, **kwargs)
 | 
			
		||||
    sys.exit(1)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user