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
This commit is contained in:
Andrew Haley 2006-02-17 13:01:40 +00:00 committed by Andrew Haley
parent 25f2dfd340
commit 24ca2a963a
4 changed files with 46 additions and 7 deletions

View File

@ -1,3 +1,15 @@
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.
2006-02-15 Matthias Klose <doko@debian.org>
* gnu/java/nio/charset, gnu/java/net/protocol/file,

View File

@ -34,6 +34,9 @@ import java.util.HashMap;
* source file and line number info. Throwable.printStackTrace() will
* be faster if this property is set to 'false'.
* </ul>
* <ul><code>gnu.gcj.runtime.NameFinder.remove_unknown</code>
* Whether calls to unknown functions (class and method names are unknown)
* should be removed from the stack trace. </ul>
* </li>
*
* <code>close()</code> should be called to get rid of all resources.
@ -57,6 +60,18 @@ public class NameFinder
("gnu.gcj.runtime.NameFinder.use_addr2line", "true")
).booleanValue();
private static final boolean remove_unknown
= Boolean.valueOf(System.getProperty
("gnu.gcj.runtime.NameFinder.remove_unknown", "true")
).booleanValue();
// Return true if non-Java frames should be removed from stack
// traces.
static final boolean removeUnknown()
{
return remove_unknown;
}
class Addr2Line
{
Process proc;

View File

@ -105,7 +105,8 @@ private:
static jclass ClassForFrame (_Jv_StackFrame *frame);
static void FillInFrameInfo (_Jv_StackFrame *frame);
static void getLineNumberForFrame(_Jv_StackFrame *frame, NameFinder *finder,
jstring *sourceFileName, jint *lineNum);
jstring *sourceFileName, jint *lineNum,
jstring *methodName);
static _Unwind_Reason_Code UnwindTraceFn (struct _Unwind_Context *context,
void *state_ptr);

View File

@ -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);