Example #1
0
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')
Example #2
0
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')
Example #3
0
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'
Example #4
0
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'
Example #5
0
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'
Example #6
0
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'
Example #7
0
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'
Example #8
0
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')
Example #9
0
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'
Example #10
0
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
Example #11
0
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
Example #12
0
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
Example #13
0
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
Example #14
0
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')
Example #15
0
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) +