diff options
| -rw-r--r-- | bitbake/lib/bb/utils.py | 30 | 
1 files changed, 23 insertions, 7 deletions
| diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index ed28f86c4b..5419af6246 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -350,22 +350,38 @@ def better_exec(code, context, text, realfile):              raise          # print the Header of the Error Message -        bb.msg.error(bb.msg.domain.Util, "Error in executing python function in: %s" % realfile) +        bb.msg.error(bb.msg.domain.Util, "There was an error when executing a python function in: %s" % realfile)          bb.msg.error(bb.msg.domain.Util, "Exception:%s Message:%s" % (t, value))          # Strip 'us' from the stack (better_exec call)          tb = tb.tb_next          import traceback +        textarray = text.split('\n') +        linefailed = traceback.tb_lineno(tb) +          tbextract = traceback.extract_tb(tb) -        tbextract = "\n".join(traceback.format_list(tbextract)) -        bb.msg.error(bb.msg.domain.Util, "Traceback:") -        for line in tbextract.split('\n'): +        tbformat = "\n".join(traceback.format_list(tbextract)) +        bb.msg.error(bb.msg.domain.Util, "The stack trace of python calls that resulted in thie exception/failure was:") +        for line in tbformat.split('\n'):              bb.msg.error(bb.msg.domain.Util, line) -        line = traceback.tb_lineno(tb) -        bb.msg.error(bb.msg.domain.Util, "The lines leading to this error were:") -        _print_trace( text.split('\n'), line ) +        bb.msg.error(bb.msg.domain.Util, "The code that was being executed was:") +        _print_trace(textarray, linefailed) +        bb.msg.error(bb.msg.domain.Util, "(file: '%s', lineno: %s, function: %s)" % (tbextract[0][0], tbextract[0][1], tbextract[0][2])) + +        # See if this is a function we constructed and has calls back into other functions in  +        # "text". If so, try and improve the context of the error by diving down the trace +        level = 0 +        nexttb = tb.tb_next +        while nexttb is not None: +            if tbextract[level][0] == tbextract[level+1][0] and tbextract[level+1][2] == tbextract[level][0]: +                _print_trace(textarray, tbextract[level+1][1]) +                bb.msg.error(bb.msg.domain.Util, "(file: '%s', lineno: %s, function: %s)" % (tbextract[level+1][0], tbextract[level+1][1], tbextract[level+1][2])) +            else: +                 break +            nexttb = tb.tb_next +            level = level + 1          raise | 
