RFR: 8329581: Java launcher no longer prints a stack trace
Thomas Stuefe
stuefe at openjdk.org
Tue Apr 16 08:28:06 UTC 2024
On Tue, 16 Apr 2024 07:55:26 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:
>> Hi folks,
>>
>> This PR aims to fix [JDK-8329581](https://bugs.openjdk.org/browse/JDK-8329581).
>>
>> I think the regression got introduced in [JDK-8315458](https://bugs.openjdk.org/browse/JDK-8315458).
>>
>> In the issue linked above, [LauncherHelper#getMainType](https://github.com/openjdk/jdk/pull/16461/files#diff-108a3a3e3c2d108c8c7f19ea498f641413b7c9239ecd2975a6c27d904c2ba226) got removed to simplify launcher code.
>>
>> Previously, we used ```getMainType``` to do the appropriate main method invocation in ```JavaMain```. However, we currently attempt to do all types of main method invocations at the same time [here](https://github.com/openjdk/jdk/blob/master/src/java.base/share/native/libjli/java.c#L623).
>>
>> Note how all of these invocations clear the exception reported with [CHECK_EXCEPTION_FAIL](https://github.com/openjdk/jdk/blob/140f56718bbbfc31bb0c39255c68568fad285a1f/src/java.base/share/native/libjli/java.c#L390).
>>
>> Therefore, if a legitimate exception comes up during one of these invocations, it does not get reported.
>>
>> I propose reintroducing ```LauncherHelper#getMainType``` but I'm looking forward to your suggestions.
>>
>> Cheers,
>> Sonia
>
> src/java.base/share/classes/sun/launcher/LauncherHelper.java line 912:
>
>> 910: private static final int MAIN_WITHOUT_ARGS = 1;
>> 911: private static final int MAIN_NONSTATIC = 2;
>> 912: private static int mainType = 0;
>
> Nit: transferring information from java to C in this way is usually done, AFAICS, by accessing static fields directly (GetStaticFieldID+GetStaticXXXField). There is also a helper function that wraps this, see JNU_GetStaticFieldByName. Not sure if you have that available in libjli though. There are many examples for both patterns.
>
> I also would consider just declaring two booleans here, isStatic and hasArgs, which that would be a bit clearer to read instead of combining both into a single flag variable, and no need to keep flag values synced across java/C.
Thinking about this some more, would it not be possible to just use the mainMethod directly down in C?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1566948449
More information about the core-libs-dev
mailing list