aboutsummaryrefslogtreecommitdiff
path: root/libjava/stacktrace.cc
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-02-17 13:01:40 +0000
committerAndrew Haley <aph@gcc.gnu.org>2006-02-17 13:01:40 +0000
commit24ca2a963aabc8157443c3a39f9fdc2bb728ca49 (patch)
tree179d83a836d62ac3b99fbbd0d3cbcefb187c1752 /libjava/stacktrace.cc
parent25f2dfd3404beff90dce23e349907f11adbfb69e (diff)
downloadgcc-24ca2a963aabc8157443c3a39f9fdc2bb728ca49.zip
gcc-24ca2a963aabc8157443c3a39f9fdc2bb728ca49.tar.gz
gcc-24ca2a963aabc8157443c3a39f9fdc2bb728ca49.tar.bz2
stacktrace.cc (GetStackTraceElements): Call gnu::gcj::runtime::NameFinder::removeUnknown() to determine if...
2006-02-16 Andrew Haley <aph@redhat.com> * stacktrace.cc (GetStackTraceElements): Call gnu::gcj::runtime::NameFinder::removeUnknown() to determine if non-Java frames should be removed from a printed stack trace. Pass methodName to getLineNumberForFrame(). (getLineNumberForFrame): Set method_name from info.dli_sname. * gnu/gcj/runtime/NameFinder.java (removeUnknown): New method. (remove_unknown): New variable. * include/java-stack.h (_Jv_StackTrace::getLineNumberForFrame): Add methodName arg. From-SVN: r111181
Diffstat (limited to 'libjava/stacktrace.cc')
-rw-r--r--libjava/stacktrace.cc23
1 files changed, 17 insertions, 6 deletions
diff --git a/libjava/stacktrace.cc b/libjava/stacktrace.cc
index 1bdabdf..16f944a 100644
--- a/libjava/stacktrace.cc
+++ b/libjava/stacktrace.cc
@@ -171,7 +171,8 @@ _Jv_StackTrace::GetStackTrace(void)
void
_Jv_StackTrace::getLineNumberForFrame(_Jv_StackFrame *frame, NameFinder *finder,
- jstring *sourceFileName, jint *lineNum)
+ jstring *sourceFileName, jint *lineNum,
+ jstring *methodName)
{
#ifdef INTERPRETER
if (frame->type == frame_interpreter)
@@ -200,6 +201,9 @@ _Jv_StackTrace::getLineNumberForFrame(_Jv_StackFrame *frame, NameFinder *finder,
else
return;
+ if (*methodName == NULL && info.dli_sname)
+ *methodName = JvNewStringUTF (info.dli_sname);
+
// addr2line expects relative addresses for shared libraries.
if (strcmp (info.dli_fname, argv0) == 0)
offset = (_Unwind_Ptr) ip;
@@ -323,16 +327,22 @@ _Jv_StackTrace::GetStackTraceElements (_Jv_StackTrace *trace,
end_idx = i - 1;
}
+ const jboolean remove_unknown
+ = gnu::gcj::runtime::NameFinder::removeUnknown();
+
// Second pass: Look up line-number info for remaining frames.
for (int i = start_idx; i <= end_idx; i++)
{
_Jv_StackFrame *frame = &trace->frames[i];
- if (frame->klass == NULL)
- // Not a Java frame.
+ if (frame->klass == NULL && remove_unknown)
+ // Not a Java frame.
continue;
-
- jstring className = frame->klass->getName ();
+
+ jstring className = NULL;
+ if (frame->klass != NULL)
+ className = frame->klass->getName ();
+
jstring methodName = NULL;
if (frame->meth)
methodName = JvNewStringUTF (frame->meth->name->chars());
@@ -340,7 +350,8 @@ _Jv_StackTrace::GetStackTraceElements (_Jv_StackTrace *trace,
jstring sourceFileName = NULL;
jint lineNum = -1;
- getLineNumberForFrame(frame, finder, &sourceFileName, &lineNum);
+ getLineNumberForFrame(frame, finder, &sourceFileName, &lineNum,
+ &methodName);
StackTraceElement *element = new StackTraceElement (sourceFileName, lineNum,
className, methodName, 0);