void xbt_backtrace_current(xbt_ex_t * e)
{
e->used = backtrace((void **) e->bt, XBT_BACKTRACE_SIZE);
+ if (e->used == 0) {
+ fprintf(stderr, "The backtrace() function failed, which probably means that the memory is exhausted. Here is a crude dump of the exception that I was trying to build:");
+ fprintf(stderr, "%s:%s(%d) [%s:%d] %s", e->host,e->procname,e->pid, e->file,e->line,e->msg);
+ fprintf(stderr, "Bailing out now since there is nothing I can do without a decent amount of memory. Please go fix the memleaks\n");
+ exit(1);
+ }
}
struct stat stat_buf;
char *binary_name = NULL;
- xbt_assert0(e
+ xbt_assert(e
&& e->used,
"Backtrace not setup yet, cannot set it up for display");
maps_name = bprintf("/proc/%d/maps", (int) getpid());
maps = fopen(maps_name, "r");
- sscanf(addrs[i], "%lx", &addr);
- sprintf(maps_buff, "%#lx", addr);
-
- if (strcmp(addrs[i], maps_buff)) {
+ addr = strtol(addrs[i], &p, 16);
+ if (*p != '\0') {
XBT_CRITICAL("Cannot parse backtrace address '%s' (addr=%#lx)",
addrs[i], addr);
}