diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index a15b81f233..641a839810 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -1225,7 +1225,7 @@ class CookerParser(object): raise except ParsingFailure as exc: self.shutdown(clean=False) - bb.fatal('Error parsing %s: %s' % + bb.fatal('Unable to parse %s: %s' % (exc.recipe, bb.exceptions.to_string(exc.realexception))) except bb.parse.ParseError as exc: bb.fatal(str(exc)) @@ -1233,13 +1233,11 @@ class CookerParser(object): logger.error('Unable to parse %s', exc.recipe) sys.exit(1) except Exception as exc: - import traceback etype, value, tb = sys.exc_info() - formatted = bb.exceptions.format_extracted(value.traceback, limit=5) - formatted.extend(traceback.format_exception_only(etype, value)) - + logger.error('Unable to parse %s', value.recipe, + exc_info=(etype, value, exc.traceback)) self.shutdown(clean=False) - bb.fatal('Error parsing %s:\n%s' % (value.recipe, ''.join(formatted))) + sys.exit(1) self.current += 1 self.virtuals += len(result) diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index 4ff530fcb4..a3288b619b 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py @@ -30,6 +30,7 @@ except ImportError: import pickle import logging import atexit +import traceback import bb.utils # This is the pid for which we should generate the event. This is set when @@ -423,6 +424,12 @@ class LogHandler(logging.Handler): """Dispatch logging messages as bitbake events""" def emit(self, record): + if record.exc_info: + etype, value, tb = record.exc_info + if hasattr(tb, 'tb_next'): + tb = list(bb.exceptions.extract_traceback(tb, context=3)) + record.bb_exc_info = (etype, value, tb) + record.exc_info = None fire(record, None) def filter(self, record): diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index a7ac850790..12d19ff8e1 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py @@ -65,9 +65,15 @@ class BBLogFormatter(logging.Formatter): def format(self, record): record.levelname = self.getLevelName(record.levelno) if record.levelno == self.PLAIN: - return record.getMessage() + msg = record.getMessage() else: - return logging.Formatter.format(self, record) + msg = logging.Formatter.format(self, record) + + if hasattr(record, 'bb_exc_info'): + etype, value, tb = record.bb_exc_info + formatted = bb.exceptions.format_exception(etype, value, tb, limit=5) + msg += '\n' + ''.join(formatted) + return msg class Loggers(dict): def __getitem__(self, key):