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;
}