Skip to content
Snippets Groups Projects
Commit 30875fa6 authored by Ian Lance Taylor's avatar Ian Lance Taylor
Browse files

libbacktrace: better backtrace_print when no debug info

Fixes https://github.com/ianlancetaylor/libbacktrace/issues/59

	* print.c (print_syminfo_callback): New static function.
	(print_callback): Call backtrace_syminfo if there is no function
	or file name.
parent a922de0a
No related merge requests found
...@@ -47,6 +47,39 @@ struct print_data ...@@ -47,6 +47,39 @@ struct print_data
FILE *f; FILE *f;
}; };
/* Print errors to stderr. */
static void
error_callback (void *data, const char *msg, int errnum)
{
struct print_data *pdata = (struct print_data *) data;
if (pdata->state->filename != NULL)
fprintf (stderr, "%s: ", pdata->state->filename);
fprintf (stderr, "libbacktrace: %s", msg);
if (errnum > 0)
fprintf (stderr, ": %s", strerror (errnum));
fputc ('\n', stderr);
}
/* Print one level of a backtrace if we couldn't get a file or function name.
Use syminfo to try to get a symbol name. */
static void print_syminfo_callback (void *data, uintptr_t pc,
const char *symname, uintptr_t symval,
uintptr_t symsize ATTRIBUTE_UNUSED)
{
struct print_data *pdata = (struct print_data *) data;
if (symname == NULL)
fprintf (pdata->f, "0x%lx ???\n\t???:0\n", (unsigned long) pc);
else
fprintf (pdata->f, "0x%lx ???\n\t%s+0x%lx:0\n",
(unsigned long) pc,
symname,
pc - symval);
}
/* Print one level of a backtrace. */ /* Print one level of a backtrace. */
static int static int
...@@ -55,6 +88,13 @@ print_callback (void *data, uintptr_t pc, const char *filename, int lineno, ...@@ -55,6 +88,13 @@ print_callback (void *data, uintptr_t pc, const char *filename, int lineno,
{ {
struct print_data *pdata = (struct print_data *) data; struct print_data *pdata = (struct print_data *) data;
if (function == NULL && filename == NULL)
{
backtrace_syminfo (pdata->state, pc, print_syminfo_callback,
error_callback, data);
return 0;
}
fprintf (pdata->f, "0x%lx %s\n\t%s:%d\n", fprintf (pdata->f, "0x%lx %s\n\t%s:%d\n",
(unsigned long) pc, (unsigned long) pc,
function == NULL ? "???" : function, function == NULL ? "???" : function,
...@@ -63,21 +103,6 @@ print_callback (void *data, uintptr_t pc, const char *filename, int lineno, ...@@ -63,21 +103,6 @@ print_callback (void *data, uintptr_t pc, const char *filename, int lineno,
return 0; return 0;
} }
/* Print errors to stderr. */
static void
error_callback (void *data, const char *msg, int errnum)
{
struct print_data *pdata = (struct print_data *) data;
if (pdata->state->filename != NULL)
fprintf (stderr, "%s: ", pdata->state->filename);
fprintf (stderr, "libbacktrace: %s", msg);
if (errnum > 0)
fprintf (stderr, ": %s", strerror (errnum));
fputc ('\n', stderr);
}
/* Print a backtrace. */ /* Print a backtrace. */
void __attribute__((noinline)) void __attribute__((noinline))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment