|
|
@ -35,28 +35,27 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames |
|
|
|
|
|
|
|
|
|
|
|
// iterate over the returned symbol lines. skip the first, it is the
|
|
|
|
// iterate over the returned symbol lines. skip the first, it is the
|
|
|
|
// address of this function.
|
|
|
|
// address of this function.
|
|
|
|
for (int i = 2; i < addrlen; i++) |
|
|
|
for (int i = 2; i < addrlen; i++) { |
|
|
|
{ |
|
|
|
|
|
|
|
char *begin_name = 0, *begin_offset = 0, *end_offset = 0; |
|
|
|
char *begin_name = 0, *begin_offset = 0, *end_offset = 0; |
|
|
|
|
|
|
|
|
|
|
|
// find parentheses and +address offset surrounding the mangled name:
|
|
|
|
// find parentheses and +address offset surrounding the mangled name:
|
|
|
|
// ./module(function+0x15c) [0x8048a6d]
|
|
|
|
// ./module(function+0x15c) [0x8048a6d]
|
|
|
|
// fprintf(out, "%s TT\n", symbollist[i]);
|
|
|
|
// fprintf(out, "%s TT\n", symbollist[i]);
|
|
|
|
for (char *p = symbollist[i]; *p; ++p) |
|
|
|
for (char *p = symbollist[i]; *p; ++p) { |
|
|
|
{ |
|
|
|
if (*p == '(') { |
|
|
|
if (*p == '(') |
|
|
|
|
|
|
|
begin_name = p; |
|
|
|
begin_name = p; |
|
|
|
else if (*p == '+') |
|
|
|
} |
|
|
|
|
|
|
|
else if (*p == '+') { |
|
|
|
begin_offset = p; |
|
|
|
begin_offset = p; |
|
|
|
else if (*p == ')' && begin_offset) { |
|
|
|
} |
|
|
|
|
|
|
|
else if ((*p == ')') && begin_offset) { |
|
|
|
end_offset = p; |
|
|
|
end_offset = p; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (begin_name && begin_offset && end_offset |
|
|
|
if (begin_name && begin_offset && end_offset |
|
|
|
&& begin_name < begin_offset) |
|
|
|
&& (begin_name < begin_offset)) { |
|
|
|
{ |
|
|
|
|
|
|
|
*begin_name++ = '\0'; |
|
|
|
*begin_name++ = '\0'; |
|
|
|
*begin_offset++ = '\0'; |
|
|
|
*begin_offset++ = '\0'; |
|
|
|
*end_offset = '\0'; |
|
|
|
*end_offset = '\0'; |
|
|
@ -80,8 +79,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames |
|
|
|
symbollist[i], begin_name, begin_offset, ++end_offset); |
|
|
|
symbollist[i], begin_name, begin_offset, ++end_offset); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else { |
|
|
|
{ |
|
|
|
|
|
|
|
// couldn't parse the line? print the whole line.
|
|
|
|
// couldn't parse the line? print the whole line.
|
|
|
|
fprintf(out, " %s\n", symbollist[i]); |
|
|
|
fprintf(out, " %s\n", symbollist[i]); |
|
|
|
} |
|
|
|
} |
|
|
|