bugs in stackTrace.c
Stefan Burstroem
kaffe@rufus.w3.org
27 Aug 98 14:00:49 +0100
Hi again!
In article <199808271019.MAA29780@kobra.efd.lth.se> you wrote:
>>
>> Hi Stefan,
>>
>> I don't think it is possible for meth to ever become 1.
>> It either points to a valid method or is NULL. Look at how
>> stackTrace.h finds the method. For the translator, findMethodFromPC
>> won't return 1. For the interpreter, TnextFrame in
>> systems/unix-jthread/internal.c maps the JNI frames with Method==1 to
>> NULL.
>>
>> Can you construct an example where this failure occurs?
>> I did not understand your NonExistingClassName example.
>Start kaffe with a classname argument for a file that doesn't exist.
>Normally this should throw a ClassNotFoundException but instead I guess
>it will throw a Null pointer exception or core dump on unix since it tries
>to access address 5 (1+4) It did that here when I tried it 1 week ago and
>I found out that meth was equal to 1 when I traced the printStackFrame calls.
>It looks like there is something broken in some other place then since the
>(void *)1 was handled at some places, but apparently not on all places.
>I am not in front of my Amiga atm but I'll get back with more info (and
>hopefully
>another patch) when I have some time to test it. (later this afternoon I
>guess)
>/Stefan
Sorry to say, but you were wrong :)
if the top stackframe contains a meth = (Method*)1 then Tnext is never
called. A possible patch would be to have STACKTRACEINIT() loop until it
has found a valid frame. Or another one would be to have buildStackTrace
look like this instead:
STACKTRACEINIT(trace, base, base);
cnt = 0;
while(!STACKTRACEEND(trace)) { /* <<<--- new code */
if(STACKTRACEMETH(trace)!=-1)
break;
STACKTRACESTEP(trace);
}
while(!STACKTRACEEND(trace)) {
STACKTRACESTEP(trace);
cnt++;
} /* <<<--- end new code */
/* Build an array of stackTraceInfo */
info = gc_malloc(sizeof(stackTraceInfo) * (cnt+1), GC_ALLOC_NOWALK);
cnt = 0;
STACKTRACEINIT(trace,base,base);
while(!STACKTRACEEND(trace)) { /* <<<--- new code */
if(STACKTRACEMETH(trace)!=-1)
break;
STACKTRACESTEP(trace);
} /* <<<--- new code */
for(; !STACKTRACEEND(trace); STACKTRACESTEP(trace)) {
info[cnt].pc = STACKTRACEPC(trace);
#if defined(INTERPRETER)
info[cnt].meth = STACKTRACEMETH(trace);
#endif
#if defined(TRANSLATOR)
info[cnt].meth = 0; /* We do this lazily */
#endif
cnt++;
}
regards, Stefan Burstroem
-----------------------------------------------------------------------
>> Irl: Stefan Burstroem << >> Omnipresence Intl. << >> Irc: Yabba <<
>> Phone: +46 (0)46-211 40 84 << >> EMail: stefan@omnipresence.com <<
-----------------------------------------------------------------------