Ejemplo n.º 1
0
def report_tombstone_android(fn):
    f_size = os.path.getsize(fn)
    if f_size > MAX_SIZE:
        cloudlog.error(f"Tombstone {fn} too big, {f_size}. Skipping...")
        return

    with open(fn, encoding='ISO-8859-1') as f:
        contents = f.read()

    message = " ".join(contents.split('\n')[5:7])

    # Cut off pid/tid, since that varies per run
    name_idx = message.find('name')
    if name_idx >= 0:
        message = message[name_idx:]

    executable = ""
    start_exe_idx = message.find('>>> ')
    end_exe_idx = message.find(' <<<')
    if start_exe_idx >= 0 and end_exe_idx >= 0:
        executable = message[start_exe_idx + 4:end_exe_idx]

    # Cut off fault addr
    fault_idx = message.find(', fault addr')
    if fault_idx >= 0:
        message = message[:fault_idx]

    sentry.report_tombstone(fn, message, contents)

    # Copy crashlog to upload folder
    clean_path = executable.replace('./', '').replace('/', '_')
    date = datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%S")

    new_fn = f"{date}_{get_commit(default='nocommit')[:8]}_{safe_fn(clean_path)}"[:
                                                                                  MAX_TOMBSTONE_FN_LEN]

    crashlog_dir = os.path.join(ROOT, "crash")
    mkdirs_exists_ok(crashlog_dir)

    shutil.copy(fn, os.path.join(crashlog_dir, new_fn))
Ejemplo n.º 2
0
def report_tombstone_apport(fn):
    f_size = os.path.getsize(fn)
    if f_size > MAX_SIZE:
        cloudlog.error(f"Tombstone {fn} too big, {f_size}. Skipping...")
        return

    message = ""  # One line description of the crash
    contents = ""  # Full file contents without coredump
    path = ""  # File path relative to openpilot directory

    proc_maps = False

    with open(fn) as f:
        for line in f:
            if "CoreDump" in line:
                break
            elif "ProcMaps" in line:
                proc_maps = True
            elif "ProcStatus" in line:
                proc_maps = False

            if not proc_maps:
                contents += line

            if "ExecutablePath" in line:
                path = line.strip().split(': ')[-1]
                path = path.replace('/data/openpilot/', '')
                message += path
            elif "Signal" in line:
                message += " - " + line.strip()

                try:
                    sig_num = int(line.strip().split(': ')[-1])
                    message += " (" + signal.Signals(sig_num).name + ")"  # pylint: disable=no-member
                except ValueError:
                    pass

    stacktrace = get_apport_stacktrace(fn)
    stacktrace_s = stacktrace.split('\n')
    crash_function = "No stacktrace"

    if len(stacktrace_s) > 2:
        found = False

        # Try to find first entry in openpilot, fall back to first line
        for line in stacktrace_s:
            if "at selfdrive/" in line:
                crash_function = line
                found = True
                break

        if not found:
            crash_function = stacktrace_s[1]

        # Remove arguments that can contain pointers to make sentry one-liner unique
        crash_function = " ".join(x for x in crash_function.split(' ')[1:]
                                  if not x.startswith('0x'))
        crash_function = re.sub(r'\(.*?\)', '', crash_function)

    contents = stacktrace + "\n\n" + contents
    message = message + " - " + crash_function
    sentry.report_tombstone(fn, message, contents)

    # Copy crashlog to upload folder
    clean_path = path.replace('/', '_')
    date = datetime.datetime.now().strftime("%Y-%m-%d--%H-%M-%S")

    new_fn = f"{date}_{get_commit(default='nocommit')[:8]}_{safe_fn(clean_path)}"[:
                                                                                  MAX_TOMBSTONE_FN_LEN]

    crashlog_dir = os.path.join(ROOT, "crash")
    mkdirs_exists_ok(crashlog_dir)

    # Files could be on different filesystems, copy, then delete
    shutil.copy(fn, os.path.join(crashlog_dir, new_fn))

    try:
        os.remove(fn)
    except PermissionError:
        pass