Beispiel #1
0
def _parse_jitlog(fileobj):
    """ JitLog is parsed. if an exception is raised after
    the header has been read, it is saved in the field 'exc' on
    the forest returned.

    This allows to parse an incomplete log file an still display
    everything that was readable!
    If a ParseException is directly raised, this is an error that cannot
    be recovered from!
    """
    try:
        is_jit_log = fileobj.read(1) == const.MARK_JITLOG_HEADER
        version = ord(fileobj.read(1)) | (ord(fileobj.read(1)) << 8)
        is_32bit = ord(fileobj.read(1))
        machine = read_string(fileobj, True)
        forest = TraceForest(version, is_32bit, machine)
        ctx = ParseContext(forest)
    except Exception:
        raise ParseException("Header malformed")
    #
    if not is_jit_log:
        raise ParseException("Missing header. Provided input might not be a jitlog!")
    if version < JITLOG_MIN_VERSION:
        raise ParseException("Version %d is not supported" % version)
    while True:
        marker = fileobj.read(1)
        if len(marker) == 0:
            break # end of file!
        if not forest.is_jitlog_marker(marker):
            msg = "marker unknown: 0x%x at pos 0x%x" % \
                      (ord(marker), fileobj.tell())
            forest.exc = ParseException(msg)
            break
        trace = forest.last_trace
        try:
            read = marks.get_reader(version, marker)
            read(ctx, trace, fileobj)
            forest.time_tick()
        except KeyError as e:
            forest.exc = e
            break
        except ParseException as e:
            forest.exc = e
            break
        except Exception as e:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            tb = traceback.extract_tb(exc_traceback, limit=3)
            msg = "failed at 0x%x with marker %s with exc \"%s\". trace back: \"%s\"" %\
                    (fileobj.tell(), marker, str(e), tb)
            forest.exc = ParseException(msg)
            break

    return forest
Beispiel #2
0
def construct_forest(fileobj, version=1, forest=None):
    if forest is None:
        forest = TraceForest(version)
    ctx = ParseContext(forest)
    try:
        while True:
            marker = fileobj.read(1)
            read = marks.get_reader(version, marker)
            trace = forest.last_trace
            read(ctx, trace, fileobj)
            forest.time_tick()
    except vmprof.reader.BufferTooSmallError:
        pass
    return forest
Beispiel #3
0
def construct_forest(fileobj, version=1, forest=None):
    if forest is None:
        forest = TraceForest(version)
    ctx = ParseContext(forest)
    try:
        while True:
            marker = fileobj.read(1)
            read = marks.get_reader(version, marker)
            trace = forest.last_trace
            read(ctx, trace, fileobj)
            forest.time_tick()
    except BufferTooSmallError:
        pass
    return forest