diff --git a/tests/backtrace.c b/tests/backtrace.c index 1247643..2e3f7b8 100644 --- a/tests/backtrace.c +++ b/tests/backtrace.c @@ -229,6 +229,7 @@ dump (Dwfl *dwfl) struct see_exec_module { + pid_t pid; Dwfl_Module *mod; char selfpath[PATH_MAX + 1]; }; @@ -241,7 +242,22 @@ see_exec_module (Dwfl_Module *mod, void **userdata __attribute__ ((unused)), struct see_exec_module *data = arg; if (strcmp (name, data->selfpath) != 0) return DWARF_CB_OK; - assert (data->mod == NULL); + if (data->mod != NULL) + { + char *selfmaps; + char buf[4096]; + FILE *file; + size_t nread; + fprintf (stderr, "Saw two modules with the same selfpath: %s\n", + data->selfpath); + asprintf (&selfmaps, "/proc/%ld/maps", (long) data->pid); + fprintf (stderr, " %s:\n", selfmaps); + file = fopen (selfmaps, "r"); + while ((nread = fread (buf, 1, sizeof buf, file)) > 0) + fwrite (buf, 1, nread, stderr); + fclose(file); + exit (-1); + } data->mod = mod; return DWARF_CB_OK; } @@ -370,6 +386,7 @@ exec_dump (const char *exec) assert (ssize > 0 && ssize < (ssize_t) sizeof (data.selfpath)); data.selfpath[ssize] = '\0'; data.mod = NULL; + data.pid = pid; ptrdiff_t ptrdiff = dwfl_getmodules (dwfl, see_exec_module, &data, 0); assert (ptrdiff == 0); assert (data.mod != NULL);