def test_exception_recover(): # weird file provided, fails without returning anything fobj = FileObj([0x0]) with pytest.raises(ParseException): _parse_jitlog(fobj) # incomplete log, bails and adds exception fobj = FileObj([const.MARK_JITLOG_HEADER, b'\x01\x00\x00', encode_str('x86_64'), b'\x00' ]) f = _parse_jitlog(fobj) assert hasattr(f, 'exc') assert "marker unknown" in f.exc.args[0] # some valid data, but most of it missing fobj = FileObj([const.MARK_JITLOG_HEADER, b'\x01\x00\x00', encode_str('x86_64'), const.MARK_START_TRACE, encode_le_u64(0xffaa), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0xffaa), const.MARK_START_TRACE # uff, trace ends here, data missing ]) f = _parse_jitlog(fobj) assert len(f.traces) == 1 assert hasattr(f, 'exc')
def test_exception_recover(): # weird file provided, fails without returning anything fobj = FileObj([0x0]) with pytest.raises(ParseException): _parse_jitlog(fobj) # incomplete log, bails and adds exception fobj = FileObj([ const.MARK_JITLOG_HEADER, b'\x01\x00\x00', encode_str('x86_64'), b'\x00' ]) f = _parse_jitlog(fobj) assert hasattr(f, 'exc') assert "marker unknown" in f.exc.args[0] # some valid data, but most of it missing fobj = FileObj([ const.MARK_JITLOG_HEADER, b'\x01\x00\x00', encode_str('x86_64'), const.MARK_START_TRACE, encode_le_u64(0xffaa), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0xffaa), const.MARK_START_TRACE # uff, trace ends here, data missing ]) f = _parse_jitlog(fobj) assert len(f.traces) == 1 assert hasattr(f, 'exc')
def test_32bit_read_trace(): fobj = FileObj([const.MARK_JITLOG_HEADER+ b"\x01\x00\x01"+encode_str('s390x'), const.MARK_START_TRACE, encode_le_u32(0x15), encode_str('loop'), encode_le_u32(0), ]) forest = _parse_jitlog(fobj) assert forest.version == 1 assert forest.word_size == 4 assert len(forest.traces) == 1 assert forest.machine == 's390x'
def test_v2_start_trace(): fobj = FileObj([const.MARK_START_TRACE, encode_le_u64(0x15), encode_str('loop'), encode_le_u64(0), encode_str('jd_is_a_hippy'), ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw, version=2) assert forest.get_trace(0x15).jd_name == 'jd_is_a_hippy'
def test_v2_start_trace(): fobj = FileObj([ const.MARK_START_TRACE, encode_le_u64(0x15), encode_str('loop'), encode_le_u64(0), encode_str('jd_is_a_hippy'), ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw, version=2) assert forest.get_trace(0x15).jd_name == 'jd_is_a_hippy'
def test_32bit_read_trace(): fobj = FileObj([ const.MARK_JITLOG_HEADER + b"\x01\x00\x01" + encode_str('s390x'), const.MARK_START_TRACE, encode_le_u32(0x15), encode_str('loop'), encode_le_u32(0), ]) forest = _parse_jitlog(fobj) assert forest.version == 1 assert forest.word_size == 4 assert len(forest.traces) == 1 assert forest.machine == 's390x'
def test_32bit_log_header(): fobj = FileObj([const.MARK_JITLOG_HEADER+ b"\x01\x00\x01"+\ encode_str('ppc64le')]) forest = _parse_jitlog(fobj) assert forest.version == 1 assert forest.word_size == 4 assert forest.machine == 'ppc64le'
def test_asm_positions(): name = struct.pack("<i", 3) + b"zAz" descr_nmr = encode_le_u64(0) fobj = FileObj([ const.MARK_RESOP_META, b"\x02\x00", b"\xff\x00\x04\x00\x00\x00fire\x00\xfe\x02\x00\x00\x00on", const.MARK_START_TRACE, encode_le_u64(0xffaa), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0xffaa), const.MARK_INPUT_ARGS, b"\x05\x00\x00\x00i1,i2", # input args const.MARK_RESOP_DESCR, b"\xff\x00\x10\x00\x00\x00i3,i2,i1,descr()" + descr_nmr, # resop const.MARK_ASM, b"\x04\x00\x08\x00\x00\x00DEADBEEF", # resop ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw) assert forest.traces[0xFFAA].inputargs == ['i1', 'i2'] assert str(forest.traces[0xFFAA].get_stage( 'noopt').ops[0]) == 'i3 = fire(i2, i1, @descr())' assert forest.traces[0xFFAA].get_stage('noopt').ops[0].core_dump == ( 4, b'DEADBEEF')
def test_counters(): descr_nmr = encode_le_u64(10) addr_len = struct.pack("<i", 8) fobj = FileObj([ const.MARK_RESOP_META + b"\x01\x00\xff\x00", encode_str("python"), const.MARK_START_TRACE, encode_le_u64(0xffaa), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0xffaa), const.MARK_INPUT_ARGS, encode_str("i1,i2"), # input args const.MARK_RESOP_DESCR, b"\xff\x00", encode_str("i3,i2,i1,descr()") + descr_nmr, # resop const.MARK_ASM, b"\x04\x00", encode_str("DEADBEEF"), # coredump const.MARK_ASM_ADDR, encode_le_u64(0xabcdef), encode_le_u64(0xabcdff), const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcdef), b'l', 15, const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcdef), b'l', 0, const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcdef), b'l', 15, const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcfff), b'l', 5, # not counted to 0xabcdef ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw) forest.get_trace_by_addr(0xabcdef).counter == 30
def test_counters(): descr_nmr = encode_le_u64(10) addr_len = struct.pack("<i", 8) fobj = FileObj([const.MARK_RESOP_META + b"\x01\x00\xff\x00", encode_str("python"), const.MARK_START_TRACE, encode_le_u64(0xffaa), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0xffaa), const.MARK_INPUT_ARGS, encode_str("i1,i2"), # input args const.MARK_RESOP_DESCR, b"\xff\x00", encode_str("i3,i2,i1,descr()") + descr_nmr, # resop const.MARK_ASM, b"\x04\x00", encode_str("DEADBEEF"), # coredump const.MARK_ASM_ADDR, encode_le_u64(0xabcdef), encode_le_u64(0xabcdff), const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcdef), b'l', encode_le_u64(15), const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcdef), b'l', encode_le_u64(0), const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcdef), b'l', encode_le_u64(15), const.MARK_JITLOG_COUNTER, encode_le_u64(0xabcfff), b'l', encode_le_u64(5), # not counted to 0xabcdef ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw) forest.get_trace_by_addr(0xabcdef).counter == 30
def test_asm_addr(): fobj = FileObj([const.MARK_START_TRACE, encode_le_u64(0x15), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0x15), const.MARK_ASM_ADDR, encode_le_u64(0xAFFE), encode_le_u64(0xFEED) ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw) trace = forest.get_trace(0x15) assert trace.addrs == (0xAFFE, 0xFEED) assert trace.jd_name == None
def test_asm_addr(): fobj = FileObj([ const.MARK_START_TRACE, encode_le_u64(0x15), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0x15), const.MARK_ASM_ADDR, encode_le_u64(0xAFFE), encode_le_u64(0xFEED) ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw) trace = forest.get_trace(0x15) assert trace.addrs == (0xAFFE, 0xFEED) assert trace.jd_name == None
def test_asm_positions(): name = struct.pack("<i", 3) + b"zAz" descr_nmr = encode_le_u64(0) fobj = FileObj([const.MARK_RESOP_META, b"\x02\x00", b"\xff\x00\x04\x00\x00\x00fire\x00\xfe\x02\x00\x00\x00on", const.MARK_START_TRACE, encode_le_u64(0xffaa), encode_str('loop'), encode_le_u64(0), const.MARK_TRACE, encode_le_u64(0xffaa), const.MARK_INPUT_ARGS, b"\x05\x00\x00\x00i1,i2", # input args const.MARK_RESOP_DESCR, b"\xff\x00\x10\x00\x00\x00i3,i2,i1,descr()" + descr_nmr, # resop const.MARK_ASM, b"\x04\x00\x08\x00\x00\x00DEADBEEF", # resop ]) fw = FileObjWrapper(fobj) forest = construct_forest(fw) assert forest.traces[0xFFAA].inputargs == ['i1','i2'] assert str(forest.traces[0xFFAA].get_stage('noopt').ops[0]) == 'i3 = fire(i2, i1, @descr())' assert forest.traces[0xFFAA].get_stage('noopt').ops[0].core_dump == (4, b'DEADBEEF')
import os import gzip from jitlog import constants as c from vmshare.binary import (encode_le_u16 as u16, encode_le_u32 as u32, encode_le_u64 as u64, encode_str, encode_le_u64 as addr) # the whole file will generate a 64 bit log test_logs = [ ('v1', c.MARK_JITLOG_HEADER + b"\x01\x00" + b"\x00" + encode_str("x86_64") + c.MARK_RESOP_META + u16(8) + u16(0) + encode_str('load') + u16(1) + encode_str('store') + u16(2) + encode_str('int_add') + u16(3) + encode_str('guard_true') + u16(4) + encode_str('guard_false') + u16(5) + encode_str('finish') + u16(6) + encode_str('label') + u16(7) + encode_str('jump') + c.MARK_START_TRACE + addr(0) + encode_str('loop') + addr(0) + c.MARK_TRACE_OPT + addr(0) + c.MARK_INIT_MERGE_POINT + u16(2) + bytes([c.MP_FILENAME[0]]) + b"s" + bytes([c.MP_SCOPE[0]]) + b"s" + c.MARK_INPUT_ARGS + encode_str('i0,i1') + c.MARK_RESOP + u16(2) + encode_str('i2,i1,i1') + c.MARK_MERGE_POINT + b"\xff" + encode_str("/home/user") + b"\xff" + encode_str("funcname1") + c.MARK_RESOP_DESCR + u16(3) + encode_str('?,i2,guard_resume') + addr(0xaffe) + c.MARK_RESOP + u16(7) + encode_str('i2,i1') + c.MARK_TRACE_ASM + addr(0) +