Hi Ralf,

On Wed, Jul 4, 2018 at 3:47 PM, Schmelter, Ralf <ralf.schmel...@sap.com> wrote:
> Hi Thomas,
>
> thank you for reviewing the change.
>
>
>> +    /* Should not usually happen. */
>> +    if (length != count) {
>> +        error = JVMTI_ERROR_INTERNAL;
>> +    }
>>
>> Cosmetics: I would also probably explicitly return:
>>
>> /* Should not usually happen. */
>> if (length != count) {
>>   jvmtiDeallocate(frames);
>>   outStream_setError(out, JDWP_ERROR(INTERNAL));
>>   return JNI_TRUE;
>> }
>>
>> .. makes the code clearer and should someone change the loop cancel
>> condition it will still work.
>
> This would still rely on the error check in the loop, since the GetStackTrace 
> JVMTI call sets the error variable too.
>
> This means it should be either explicit for both cases:
>     error = JVMTI_FUNC_PTR(gdata->jvmti, GetStackTrace)
>                           (gdata->jvmti, thread, startIndex, length, frames, 
> &count);
>
>     If (error != JVMTI_ERROR_NONE) {
>         jvmtiDeallocate(frames);
>         outStream_setError(out, map2jdwpError(error));
>         return JNI_TRUE;
>     }
>
>     /* Should not happen. */
>     if (length != count) {
>         jvmtiDeallocate(frames);
>         outStream_setError(out, JDWP_ERROR(INTERNAL));
>         return JNI_TRUE;
>     }
>
> or none (note that the original code could overwrite the error from the 
> GetStackTrace call, which is fixed here):
>     error = JVMTI_FUNC_PTR(gdata->jvmti, GetStackTrace)
>                           (gdata->jvmti, thread, startIndex, length, frames, 
> &count);
>
>     /* Should not happen. */
>     if (error == JVMTI_ERROR_NONE  && length != count) {
>         error = JVMTI_ERROR_INTERNAL;
>     }
>

Okay, in that case I prefer the second variant. At least only one
deallocate call then.

>
>
>> +    for (fnum = 0; (fnum < count) && (error == JVMTI_ERROR_NONE); ++fnum) {
>>
>> you could loose the inner brackets.
>>
>> --
>>
>> Cosmetics: you changed meaning of fnum. Before it was really the frame
>> number. Now, fnum is a zero based index into your array. So I would
>> probably have renamed the variable too, maybe index? or somesuch.
>
> Ok, index it is.
>
>

Thanks.

>
>> Do we not have to handle opaque frames like the code before did? Or
>> does GetStackTrace already filter out opaque frames? Would that not
>> mean that GetStackTrace returns fewer frames than expected, and then
>> count could be smaller than length?
>
>> -- oh wait I see GetFrameLocation never really returned
>> JVMTI_ERROR_OPAQUE_FRAME? So it is probably fine.
>
> Exactly. The old code would have skipped native methods in the stack trace, 
> if JVMTI_ERROR_OPAQUE_FRAME would have been returned. But since this was in 
> fact not returned, the stacks should look the same.
>
>
>
>
>> How large can the depth get? In stack overflow scenarios?
>>
>> To limit memory usage and to make it more predictable, I would not
>> retrieve all frames in one go but in a loop, in bulks a n frames. E.g.
>> 4086 frames would mean your buffer never exceeds 64K on 64bit
>> platforms. You would sacrifice a tiny bit of performance (again
>> needless walking up to starting position) but would not choke out when
>> stacks are ridiculously large.
>
> In theory or in practice? Practically a stack overflow will have at most a 
> few 100 thousand frames, usually much less (10 to 20 thousand). But one can 
> image a scenario where the JIT could statically inline a lot of calls, 
> leading to many Java frames per (small) physical frame.
>
> But you should consider, that the whole stack is written 'to memory' already, 
> since the packet output stream is backed completely by memory. So the memory 
> requirement is already O(nrOfFrames).

Okay. Just did a quick calculation, we need now 33 bytes per frame in
the outputstream, and now we need 16 more. But I find it difficult to
see how one would be a problem and the other would not. So okay, lets
keep the code simple.

>
>
>> I cannot comment on the jtreg test. Looks fine to me, but I wonder
>> whether there is a better way to script jdb, is this how we are
>> supposed to do this?
>
> I don't know. But the ShellScaffold.sh library is used by over 40 other JDI 
> test, so I used it too.
>
> Best regards,
> Ralf

Okay. From my point, this is reviewed.

Thanks & Best Regards, Thomas

>

Reply via email to