def read_one_marker(fileobj, status, buffer_so_far=None): fileobj = FileObjWrapper(fileobj, buffer_so_far) marker = fileobj.read(1) if marker == MARKER_STACKTRACE: count = read_word(fileobj) # for now assert count == 1 depth = read_word(fileobj) assert depth <= 2**16, 'stack strace depth too high' trace = read_trace(fileobj, depth, status.version, status.profile_lines) if status.version >= VERSION_THREAD_ID: thread_id, = struct.unpack('l', fileobj.read(WORD_SIZE)) else: thread_id = 0 if status.profile_memory: mem_in_kb, = struct.unpack('l', fileobj.read(WORD_SIZE)) else: mem_in_kb = 0 trace.reverse() status.profiles.append((trace, 1, thread_id, mem_in_kb)) elif marker == MARKER_VIRTUAL_IP: unique_id = read_word(fileobj) name = read_string(fileobj) if PY3: name = name.decode() status.virtual_ips[unique_id] = name elif marker == MARKER_TRAILER: return True # finished else: raise FileReadError("unexpected marker: %d" % ord(marker)) return False
def read_header(fileobj, buffer_so_far=None): fileobj = FileObjWrapper(fileobj, buffer_so_far) assert_error(read_word(fileobj) == 0) assert_error(read_word(fileobj) == 3) assert_error(read_word(fileobj) == 0) period = read_word(fileobj) assert_error(read_word(fileobj) == 0) interp_name, version, profile_memory, profile_lines = _read_header(fileobj) return ReaderStatus(interp_name, period, version, None, profile_memory, profile_lines)
def read_one_marker(fileobj, status, buffer_so_far=None): fileobj = FileObjWrapper(fileobj, buffer_so_far) marker = fileobj.read(1) if marker == MARKER_STACKTRACE: count = read_word(fileobj) # for now assert count == 1 depth = read_word(fileobj) assert depth <= 2**16, 'stack strace depth too high' trace = read_trace(fileobj, depth, status.version, status.profile_lines) if status.version >= VERSION_THREAD_ID: thread_id = read_addr(fileobj) else: thread_id = 0 if status.profile_memory: mem_in_kb = read_addr(fileobj) else: mem_in_kb = 0 trace.reverse() status.profiles.append((trace, 1, thread_id, mem_in_kb)) elif marker == MARKER_VIRTUAL_IP or marker == MARKER_NATIVE_SYMBOLS: unique_id = read_addr(fileobj) name = read_string(fileobj) if PY3K: name = name.decode() status.virtual_ips[unique_id] = name elif marker == MARKER_META: read_string(fileobj) read_string(fileobj) # TODO save the for the tests? elif marker == MARKER_TRAILER: return True # finished elif marker == MARKER_TIME_N_ZONE: read_time_and_zone(fileobj) else: raise FileReadError("unexpected marker: %d" % ord(marker)) return False
def read_header(fileobj, buffer_so_far=None): fileobj = FileObjWrapper(fileobj, buffer_so_far) assert_error(read_word(fileobj) == 0) assert_error(read_word(fileobj) == 3) assert_error(read_word(fileobj) == 0) period = read_word(fileobj) assert_error(read_word(fileobj) == 0) marker = fileobj.read(1) assert_error(marker == MARKER_HEADER, "expected header") version, = struct.unpack("!h", fileobj.read(2)) if version >= VERSION_MODE_AWARE: mode = ord(fileobj.read(1)) profile_memory = (mode & PROFILE_MEMORY) != 0 profile_lines = (mode & PROFILE_LINES) != 0 else: profile_memory = version == VERSION_MEMORY profile_lines = False lgt = ord(fileobj.read(1)) interp_name = fileobj.read(lgt) if PY3: interp_name = interp_name.decode() return ReaderStatus(interp_name, period, version, None, profile_memory, profile_lines)
def read_prof(fileobj, virtual_ips_only=False): fileobj = gunzip(fileobj) assert read_word(fileobj) == 0 # header count assert read_word(fileobj) == 3 # header size assert read_word(fileobj) == 0 period = read_word(fileobj) assert read_word(fileobj) == 0 virtual_ips = [] profiles = [] interp_name = None version = 0 profile_memory = False profile_lines = False while True: marker = fileobj.read(1) if marker == MARKER_HEADER: assert not version, "multiple headers" version, = struct.unpack("!h", fileobj.read(2)) if version >= VERSION_MODE_AWARE: mode = ord(fileobj.read(1)) profile_memory = (mode & PROFILE_MEMORY) != 0 profile_lines = (mode & PROFILE_LINES) != 0 else: profile_memory = version == VERSION_MEMORY profile_lines = False lgt = ord(fileobj.read(1)) interp_name = fileobj.read(lgt) if PY3: interp_name = interp_name.decode() elif marker == MARKER_STACKTRACE: count = read_word(fileobj) # for now assert count == 1 depth = read_word(fileobj) assert depth <= 2**16, 'stack strace depth too high' if virtual_ips_only: fileobj.read(WORD_SIZE * depth) trace = [] else: trace = read_trace(fileobj, depth, version, profile_lines) if version >= VERSION_THREAD_ID: thread_id, = struct.unpack('l', fileobj.read(WORD_SIZE)) else: thread_id = 0 if profile_memory: mem_in_kb, = struct.unpack('l', fileobj.read(WORD_SIZE)) else: mem_in_kb = 0 trace.reverse() profiles.append((trace, 1, thread_id, mem_in_kb)) elif marker == MARKER_INTERP_NAME: assert not version, "multiple headers" assert not interp_name, "Dual interpreter name header" lgt = ord(fileobj.read(1)) interp_name = fileobj.read(lgt) if PY3: interp_name = interp_name.decode() elif marker == MARKER_VIRTUAL_IP: unique_id = read_word(fileobj) name = read_string(fileobj) if PY3: name = name.decode() virtual_ips.append((unique_id, name)) elif marker == MARKER_TRAILER: #if not virtual_ips_only: # symmap = read_ranges(fileobj.read()) break else: assert not marker, (fileobj.tell(), repr(marker)) break virtual_ips.sort() # I think it's sorted, but who knows if virtual_ips_only: return virtual_ips return period, profiles, virtual_ips, interp_name