dnl keep them alpha-sorted!
AC_CHECK_HEADERS([assert.h])
AC_CHECK_HEADERS([errno.h])
+AC_CHECK_HEADERS([execinfo.h])
AC_CHECK_HEADERS([fcntl.h])
AC_CHECK_HEADERS([libgen.h])
AC_CHECK_HEADERS([netdb.h])
AC_CHECK_FUNCS([access])
AC_CHECK_FUNCS([atoi])
AC_CHECK_FUNCS([atol])
+AC_CHECK_FUNCS([backtrace])
+AC_CHECK_FUNCS([backtrace_symbols])
AC_CHECK_FUNCS([calloc])
AC_CHECK_FUNCS([close])
AC_CHECK_FUNCS([confstr])
Copyright (C) 2007, 2008
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+ Copyright (C) 2008 Theobroma Systems Ltd.
This file is part of CACAO.
}
+/**
+ * Print a C backtrace.
+ */
+void os::print_backtrace()
+{
+#define BACKTRACE_SIZE 100
+ void** array = new void*[SIZEOF_VOID_P * BACKTRACE_SIZE];
+
+ // Get the backtrace.
+ int size = backtrace(array, BACKTRACE_SIZE);
+
+ // Resolve the symbols.
+ char** strings = backtrace_symbols(array, size);
+
+ log_println("Backtrace (%d stack frames):", size);
+
+ for (int i = 0; i < size; i++)
+ log_println("%s", strings[i]);
+
+ // We have to free the strings.
+ free(strings);
+}
+
+
/**
* Returns the number of online processors in the system.
*
Copyright (C) 2007, 2008
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+ Copyright (C) 2008 Theobroma Systems Ltd.
This file is part of CACAO.
# include <errno.h>
#endif
+#if defined(HAVE_EXECINFO_H)
+# include <execinfo.h>
+#endif
+
#if defined(HAVE_FCNTL_H)
# include <fcntl.h>
#endif
static inline int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
static inline int access(const char *pathname, int mode);
static inline int atoi(const char* nptr);
+ static inline int backtrace(void** array, int size);
+ static inline char** backtrace_symbols(void* const* array, int size) throw ();
static inline void* calloc(size_t nmemb, size_t size);
static inline int close(int fd);
static inline int connect(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
static inline size_t strlen(const char* s);
static inline char* strerror(int errnum);
+ // Convenience functions.
static void* mmap_anonymous(void *addr, size_t len, int prot, int flags);
- static int processors_online(void);
+ static void print_backtrace();
+ static int processors_online();
};
#endif
}
+inline int os::backtrace(void** array, int size)
+{
+#if defined(HAVE_BACKTRACE)
+ return ::backtrace(array, size);
+#else
+ log_println("os::backtrace: Not available.");
+ return 0;
+#endif
+}
+
+inline char** os::backtrace_symbols(void* const* array, int size) throw ()
+{
+#if defined(HAVE_BACKTRACE_SYMBOLS)
+ return ::backtrace_symbols(array, size);
+#else
+ log_println("os::backtrace_symbols: Not available.");
+ return NULL;
+#endif
+}
+
inline void* os::calloc(size_t nmemb, size_t size)
{
#if defined(HAVE_CALLOC)