From 283a159fe38e477d93b189d43888f1e42043c0af Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Mon, 17 Jan 2000 15:45:24 +0000 Subject: natThrowable.cc: New file. 2000-01-14 Andrew Haley * java/lang/natThrowable.cc: New file. * java/lang/Throwable.java (fillInStackTrace): Make native. (printStackTrace): Call native method to do this. (Throwable): Call fillInStackTrace. (stackTrace): New variable. * include/jvm.h: Add _Jv_ThisExecutable functions. * prims.cc: (_Jv_execName): New variable. (catch_segv): Call fillInStackTrace. (catch_fpe): Ditto. (_Jv_ThisExecutable): New functions. (JvRunMain): Set the name of this executable. * Makefile.am: Add java/lang/natThrowable.cc. Add name-finder.cc. * Makefile.in: Rebuilt. * acconfig.h: Add HAVE_PROC_SELF_EXE. * configure.in: Force link with __frame_state_for in FORCELIBGCCSPEC. Add new checks for backtrace. * include/config.h.in: Rebuilt. * name-finder.cc: New file. * include/name-finder.h: New file. From-SVN: r31460 --- libjava/java/lang/natThrowable.cc | 95 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 libjava/java/lang/natThrowable.cc (limited to 'libjava/java/lang/natThrowable.cc') diff --git a/libjava/java/lang/natThrowable.cc b/libjava/java/lang/natThrowable.cc new file mode 100644 index 0000000..2227e7d --- /dev/null +++ b/libjava/java/lang/natThrowable.cc @@ -0,0 +1,95 @@ +// natThrowable.cc - Superclass for all exceptions. + +/* Copyright (C) 2000 Red Hat Inc + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +/** + * @author Andrew Haley + * @date Jan 6 2000 + */ + +#include + +#include + +#pragma implementation "Throwable.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +#ifdef HAVE_EXECINFO_H +#include +#endif + +#include + +/* FIXME: size of the stack trace is limited to 128 elements. It's + undoubtedly sensible to limit the stack trace, but 128 is rather + arbitrary. It may be better to configure this. */ + +java::lang::Throwable * +java::lang::Throwable::fillInStackTrace (void) +{ +#ifdef HAVE_BACKTRACE + void *p[128]; + + // We subtract 1 from the number of elements because we don't want + // to include the call to fillInStackTrace in the trace. + int n = backtrace (p, 128) - 1; + + // ??? Might this cause a problem if the byte array isn't aligned? + stackTrace = JvNewByteArray (n * sizeof p[0]); + memcpy (elements (stackTrace), p+1, (n * sizeof p[0])); + + return this; +#endif +} + +void +java::lang::Throwable::printStackTrace (java::io::PrintWriter *wr) +{ + wr->println (toString ()); +#ifdef HAVE_BACKTRACE + if (!stackTrace) + return; + + void **p = (void **)elements (stackTrace); + int depth = stackTrace->length / sizeof p[0]; + + _Jv_name_finder finder (_Jv_ThisExecutable ()); + + for (int i = 0; i < depth; i++) + { + bool found = finder.lookup (p[i]); + wr->print (JvNewStringLatin1 (" at ")); + wr->print (JvNewStringLatin1 (finder.hex)); + if (found) + { + wr->print (JvNewStringLatin1 (": ")); + wr->print (JvNewStringLatin1 (finder.method_name)); + wr->print (JvNewStringLatin1 (" (")); + wr->print (JvNewStringLatin1 (finder.file_name)); + wr->print (JvNewStringLatin1 (")")); + } + wr->println (); + } +#endif /* HAVE_BACKTRACE */ +} + -- cgit v1.1