Print warning to the user if stacktrace contains no function names

Count matched function names, and if there are no, point out to the user
that the stacktrace is useless. If not all stactrace elements contain
function names, suggest user that installing debug packages may improve
the stacktrace usefulness.
This commit is contained in:
Eugene Shalygin 2016-12-17 17:35:40 +01:00
parent 514de7edc4
commit 05dbea390b

View file

@ -33,6 +33,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
size_t funcnamesize = 256; size_t funcnamesize = 256;
char *funcname = (char *)malloc(funcnamesize); char *funcname = (char *)malloc(funcnamesize);
int functionNamesFound = 0;
// 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++) {
@ -78,6 +79,7 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
fprintf(out, " %s : %s()+%s %s\n", fprintf(out, " %s : %s()+%s %s\n",
symbollist[i], begin_name, begin_offset, ++end_offset); symbollist[i], begin_name, begin_offset, ++end_offset);
} }
++functionNamesFound;
} }
else { else {
// couldn't parse the line? print the whole line. // couldn't parse the line? print the whole line.
@ -85,6 +87,14 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
} }
} }
if (!functionNamesFound) {
fprintf(out, "There were no function names found in the stack trace\n."
"Seems like debug symbols are not installed, and the stack trace is useless.\n");
}
if (functionNamesFound < addrlen - 2) {
fprintf(out, "Consider installing debug symbols for packages containing files with empty"
" function names (i.e. empty braces \"()\") to make your stack trace more useful\n");
}
free(funcname); free(funcname);
free(symbollist); free(symbollist);
} }