Now we use bb.exceptions to pass pickleable traceback entries to the UI, and
the UI is free to do whatever it wants to do with this information. By
default, the log formatter for the UIs formats it with bb.exceptions. This
also means that all exceptions should now show 3 lines of context and limit to
5 entries.
(Bitbake rev:
ee48d628ee038bd72e1cd94aa75f5ccbacbcee4c)
Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
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))
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)
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
"""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):
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):