- case 'b': /* backtrace; called %throwable in LOG4J */
- case 'B': /* short backtrace; called %throwable{short} in LOG4J */
-#if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE)
- {
- xbt_ex_t e;
- int i;
-
- e.used = backtrace((void **) e.bt, XBT_BACKTRACE_SIZE);
- e.bt_strings = NULL;
- e.msg = NULL;
- e.remote = 0;
- xbt_backtrace_current(&e);
- if (*q == 'B') {
- show_string(e.bt_strings[2] + 8);
- } else {
- for (i = 2; i < e.used; i++)
- if (precision == -1) {
- p += snprintf(p, XBT_LOG_BUFF_SIZE - (p - ev->buffer),
- "%s\n", e.bt_strings[i] + 8);
- check_overflow;
- } else {
- p += sprintf(p, "%.*s\n",
- (int) MIN(XBT_LOG_BUFF_SIZE -
- (p - ev->buffer), precision),
- e.bt_strings[i] + 8);
- check_overflow;
- precision = -1;
- }
- }
-
- xbt_ex_free(e);
- }
-#else
- p += snprintf(p, XBT_LOG_BUFF_SIZE - (p - ev->buffer),
- "(no backtrace on this arch)");
- check_overflow;
-#endif
- break;
-
- case 'd': /* date; LOG4J compliant */
- show_double(gras_os_time());
- break;
- case 'r': /* application age; LOG4J compliant */
- show_double(gras_os_time() - format_begin_of_time);
- break;
-
- case 'm': /* user-provided message; LOG4J compliant */
- if (precision == -1) {
- p += vsnprintf(p, XBT_LOG_BUFF_SIZE - (p - ev->buffer), msg_fmt,
- ev->ap);
- check_overflow;
- } else {
- p += vsnprintf(p,
- (int) MIN(XBT_LOG_BUFF_SIZE - (p - ev->buffer),
- precision), msg_fmt, ev->ap);
- check_overflow;
- precision = -1;
- }