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:
parent
25f2dfd340
commit
24ca2a963a
4 changed files with 46 additions and 7 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue