ResolvedTrace resolve()

in src/backward.h [3272:3329]


    ResolvedTrace resolve(ResolvedTrace trace)
    {
        // parse:
        // <n>  <file>  <addr>  <mangled-name> + <offset>
        char* filename = _symbols[trace.idx];

        // skip "<n>  "
        while (*filename && *filename != ' ')
            filename++;
        while (*filename == ' ')
            filename++;

        // find start of <mangled-name> from end (<file> may contain a space)
        char* p = filename + strlen(filename) - 1;
        // skip to start of " + <offset>"
        while (p > filename && *p != ' ')
            p--;
        while (p > filename && *p == ' ')
            p--;
        while (p > filename && *p != ' ')
            p--;
        while (p > filename && *p == ' ')
            p--;
        char* funcname_end = p + 1;

        // skip to start of "<manged-name>"
        while (p > filename && *p != ' ')
            p--;
        char* funcname = p + 1;

        // skip to start of "  <addr>  "
        while (p > filename && *p == ' ')
            p--;
        while (p > filename && *p != ' ')
            p--;
        while (p > filename && *p == ' ')
            p--;

        // skip "<file>", handling the case where it contains a
        char* filename_end = p + 1;
        if (p == filename) {
            // something went wrong, give up
            filename_end = filename + strlen(filename);
            funcname = filename_end;
        }
        trace.object_filename.assign(filename, filename_end); // ok even if filename_end is the ending \0
                                                              // (then we assign entire string)

        if (*funcname) { // if it's not end of string
            *funcname_end = '\0';

            trace.object_function = this->demangle(funcname);
            trace.object_function += " ";
            trace.object_function += (funcname_end + 1);
            trace.source.function = trace.object_function; // we cannot do better.
        }
        return trace;
    }