From aa3ac5865df5d4444b8dd43845f0428e56c03d64 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Sun, 5 Dec 2010 22:52:44 +0000 Subject: [PATCH] bitbake/utils.py: Improve traceback to be more helpful/clear to users Signed-off-by: Richard Purdie --- bitbake/lib/bb/utils.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index ed28f86..5419af6 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 -- 2.7.4