On Tue, 13 May 2025 10:26:51 GMT, Aleksey Shipilev <sh...@openjdk.org> wrote:

>> src/java.base/unix/native/libjava/ProcessImpl_md.c line 346:
>> 
>>> 344:         if (ret != EINVAL)
>>> 345:             detail = tmpbuf;
>>> 346:     }
>> 
>> Pre-existing, possibly as follow-up: 
>> 
>> I wonder whether we can do more. I don't like how we either only print out 
>> the errno string, or only print out the "Default" detail (I don't like the 
>> "default" prefix since it's really useful context information about this 
>> errno). 
>> 
>> For a problem on this side, we mostly pass in errno, then swallow the 
>> "defaultdetail". E.g. for posix_spawn failure, we'd print e.g. "12:Out of 
>> memory\nPossible reasons: ... " (or whatever localized string strerror 
>> returns).
>> 
>> For errors that happen inside the jspawnhelper (see line 790ff where we pass 
>> 0 for the errno), we print out "0:Bad code from spawn helper\nPossible 
>> reasons: ... ", so we swallow the errno we got from the jspawnhelper.
>> 
>> Could we print out instead the default, then the errno string, then the 
>> Possible reasons text? E.g.
>> "posix_spawn failed (12:Out of memory)\nPossible reasons: ..."
>> or
>> "Bad code from spawn helper (12:Out of memory)\nPossible reasons: ..." 
>> 
>> There is an issue of errnum values from the far side possibly intersecting 
>> with valid errno. Could be solved simply by assigning negative values to 
>> ERR_MALLOC, ERR_PIPE and ERR_ARGS. I am not aware of any errno values being 
>> negative. The errno printing would need to recognise these three values in 
>> addition to errno values. We also could remove the +3 workaround in the test.
>> 
>> The only argument I see against is some vague form of backward 
>> compatibility, in case people get confused about the new information, or 
>> that existing tools parse this output.
>
> Yeah, I dislike `defaultDetail` naming and the fact we swallow it. I see good 
> reason to print it unconditionally. I think we can do this with just a little 
> code massaging. See new commit. It prints the message like:
> 
> 
> Recursively executing 'JspawnhelperProtocol simulateCrashInChild4'
> posix_spawn:0
> java.io.IOException: Cannot run program "pwd": Failed to exec spawn helper: 
> pid: 1405770, exit code: 4, error: 0 (none) 
> Possible reasons:
>   - Spawn helper ran into JDK version mismatch
>   - Spawn helper ran into unexpected internal error
>   - Spawn helper was terminated by another process
> Possible solutions:
>   - Restart JVM, especially after in-place JDK updates
>   - Check system logs for JDK-related errors
>   - Re-install JDK to fix permission/versioning problems
>   - Switch to legacy launch mechanism with 
> -Djdk.lang.Process.launchMechanism=VFORK
> 
>       at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110)
>       at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1044)
>       at java.base/java.lang.Runtime.exec(Runtime.java:605)
>       at java.base/java.lang.Runtime.exec(Runtime.java:470)
>       at JspawnhelperProtocol.parentCode(JspawnhelperProtocol.java:58)
>       at JspawnhelperProtocol.main(JspawnhelperProtocol.java:232)

I like this.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/24149#discussion_r2086751118

Reply via email to