diff options
author | Andrew Haley <aph@redhat.com> | 2006-02-17 13:01:40 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2006-02-17 13:01:40 +0000 |
commit | 24ca2a963aabc8157443c3a39f9fdc2bb728ca49 (patch) | |
tree | 179d83a836d62ac3b99fbbd0d3cbcefb187c1752 /libjava/stacktrace.cc | |
parent | 25f2dfd3404beff90dce23e349907f11adbfb69e (diff) | |
download | gcc-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.cc | 23 |
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); |