summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/utils.py30
1 files changed, 23 insertions, 7 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
index ed28f86c4..5419af624 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