Пример #1
0
def test_app_loadable_elf(env, extra_data):
    rel_project_path = os.path.join('tools', 'test_apps', 'system', 'gdb_loadable_elf')
    app_files = ['gdb_loadable_elf.elf']
    target = 'esp32'
    app = ttfw_idf.LoadableElfTestApp(rel_project_path, app_files, target=target)
    idf_path = app.get_sdk_path()
    proj_path = os.path.join(idf_path, rel_project_path)
    elf_path = os.path.join(app.binary_path, 'gdb_loadable_elf.elf')
    esp_log_path = os.path.join(proj_path, 'esp.log')

    with SerialThread(esp_log_path):
        openocd_log = os.path.join(proj_path, 'openocd.log')
        gdb_log = os.path.join(proj_path, 'gdb.log')
        gdb_init = os.path.join(proj_path, 'gdbinit_' + target)
        gdb_dir = os.path.join(proj_path, 'main')

        with ttfw_idf.OCDBackend(openocd_log, app.target):
            with ttfw_idf.GDBBackend(gdb_log, elf_path, app.target, gdb_init, gdb_dir) as p:
                def wait_for_breakpoint():
                    p.gdb.wait_target_state(debug_backend.TARGET_STATE_RUNNING)
                    stop_reason = p.gdb.wait_target_state(debug_backend.TARGET_STATE_STOPPED)
                    assert stop_reason == debug_backend.TARGET_STOP_REASON_BP, 'STOP reason: {}'.format(stop_reason)

                wait_for_breakpoint()

                p.gdb.add_bp('esp_restart')
                p.gdb.exec_continue()

                wait_for_breakpoint()

    if pexpect.run('grep "Restarting now." {}'.format(esp_log_path), withexitstatus=True)[1]:
        raise RuntimeError('Expected output from ESP was not received')
Пример #2
0
def test_examples_sysview_tracing_heap_log(env, extra_data):

    rel_project_path = os.path.join('examples', 'system', 'sysview_tracing_heap_log')
    dut = env.get_dut('sysview_tracing_heap_log', rel_project_path)
    proj_path = os.path.join(dut.app.idf_path, rel_project_path)
    elf_path = os.path.join(dut.app.binary_path, 'sysview_tracing_heap_log.elf')

    def get_temp_file():
        with tempfile.NamedTemporaryFile(delete=False) as f:
            return f.name

    try:
        tempfiles = [get_temp_file(), get_temp_file()]

        with open(os.path.join(proj_path, 'gdbinit')) as f_in, open(tempfiles[0], 'w') as f_out:
            new_content = f_in.read()
            # localhost connection issue occurs in docker unless:
            new_content = new_content.replace(':3333', '127.0.0.1:3333', 1)
            new_content = new_content.replace('file:///tmp/heap_log.svdat', 'file://{}'.format(tempfiles[1]), 1)
            f_out.write(new_content)

        with ttfw_idf.OCDBackend(os.path.join(proj_path, 'openocd.log'), dut.app.target):
            dut.start_app()
            dut.expect('esp_apptrace: Initialized TRAX on CPU0')

            gdb_log = os.path.join(proj_path, 'gdb.log')
            gdb_workdir = os.path.join(proj_path, 'main')
            with ttfw_idf.GDBBackend(gdb_log, elf_path, dut.app.target, tempfiles[0], gdb_workdir) as p:
                for _ in range(2):  # There are two breakpoints
                    p.gdb.wait_target_state(debug_backend.TARGET_STATE_RUNNING)
                    stop_reason = p.gdb.wait_target_state(debug_backend.TARGET_STATE_STOPPED)
                    assert stop_reason == debug_backend.TARGET_STOP_REASON_BP, 'STOP reason: {}'.format(stop_reason)

                # dut has been restarted by gdb since the last dut.expect()
                dut.expect('esp_apptrace: Initialized TRAX on CPU0')

        with ttfw_idf.CustomProcess(' '.join([os.path.join(dut.app.idf_path, 'tools/esp_app_trace/sysviewtrace_proc.py'),
                                              '-p',
                                              '-b', elf_path,
                                              tempfiles[1]]),
                                    logfile='sysviewtrace_proc.log') as sysviewtrace:
            sysviewtrace.pexpect_proc.expect(re.compile(r'Found \d+ leaked bytes in \d+ blocks.'), timeout=120)
    finally:
        for x in tempfiles:
            try:
                os.unlink(x)
            except Exception:
                pass
Пример #3
0
def test_examples_sysview_tracing(env, extra_data):

    rel_project_path = os.path.join('examples', 'system', 'sysview_tracing')
    dut = env.get_dut('sysview_tracing', rel_project_path)
    proj_path = os.path.join(dut.app.idf_path, rel_project_path)
    elf_path = os.path.join(dut.app.binary_path, 'sysview_tracing.elf')

    def get_temp_file():
        with tempfile.NamedTemporaryFile(delete=False) as f:
            return f.name

    try:
        tempfiles = [get_temp_file(), get_temp_file()]

        with open(os.path.join(proj_path,
                               'gdbinit')) as f_in, open(tempfiles[0],
                                                         'w') as f_out:
            new_content = f_in.read()
            # localhost connection issue occurs in docker unless:
            new_content = new_content.replace(':3333', '127.0.0.1:3333', 1)
            new_content = new_content.replace(
                'file:///tmp/sysview_example.svdat',
                'file://{}'.format(tempfiles[1]), 1)
            f_out.write(new_content)

        with ttfw_idf.OCDBackend(os.path.join(proj_path, 'openocd.log'),
                                 dut.app.target) as oocd:
            dut.start_app()

            def dut_expect_task_event():
                dut.expect(re.compile(
                    r'example: Task\[0x3[0-9A-Fa-f]+\]: received event \d+'),
                           timeout=30)

            dut_expect_task_event()

            gdb_log = os.path.join(proj_path, 'gdb.log')
            gdb_workdir = os.path.join(proj_path, 'main')
            with ttfw_idf.GDBBackend(gdb_log, elf_path, dut.app.target,
                                     tempfiles[0], gdb_workdir) as p:
                p.gdb.wait_target_state(debug_backend.TARGET_STATE_RUNNING)
                stop_reason = p.gdb.wait_target_state(
                    debug_backend.TARGET_STATE_STOPPED)
                assert stop_reason == debug_backend.TARGET_STOP_REASON_BP, 'STOP reason: {}'.format(
                    stop_reason)

                dut.expect(
                    'example: Created task'
                )  # dut has been restarted by gdb since the last dut.expect()
                dut_expect_task_event()

                # Do a sleep while sysview samples are captured.
                time.sleep(3)
                # GDBMI isn't responding now to any commands, therefore, the following command is issued to openocd
                oocd.cmd_exec('esp sysview stop')
    finally:
        for x in tempfiles:
            try:
                os.unlink(x)
            except Exception:
                pass