RFR: JDK-8059586: hs_err report should treat redirected core pattern.
Yasumasa Suenaga
yasuenag at gmail.com
Tue Dec 2 14:30:19 UTC 2014
Hi David, Thomas,
I've uploaded new webrev:
http://cr.openjdk.java.net/~ysuenaga/JDK-8059586/webrev.04/
>> I want to rewrite a patch as below:
>>
>> - Use async signal safety functions.
>> fopen -> open, fgets -> read, etc.
>
> This is commendable if it is practical, but error reporting already does many, many things that are not async-signal safe, so there is no need to go to extreme measures here.
I've used async-signal safe functions as possible.
>> - Use O_BUFLEN for buffer size.
>> O_BUFLEN is defined to 2000 in ostream.hpp .
>> This macro is used in various points. VMError::coredump_message is
>> also defined with this value.
>>
>>
>> I think PATH_MAX is fine. I think O_BUFLEN was originally used as a max.
>> length of temporary buffers to assemble an output line. And then it
>> spread a bit. But your intend is to hold a path and using PATH_MAX
>> clearly documents this.
I've used PATH_MAX again.
>> And, to really nitpick, right now you do not handle ERANGE with
>> get_current_path() (if the provided buffer is too small), which is
>> probably fine because it is improbable that a path is larger than
>> PATH_MAX. But if you change the size of the buffer to something which
>> may be smaller than PATH_MAX (O_BUFLEN), get_current_directory() may fail.
If get_current_path() call is failed in get_core_path(), get_core_path()
returns immediately with 0.
Caller (check_or_create_dump()) handles this result as illegal state.
get_current_path() calls getcwd() only and redirects result to caller.
So result of this function is NULL, we can judge getcwd() was finished with
error.
I think it is enough.
>> I like your patch, I think it could be a nice time safer when
>> core_pattern is something unusual. But I also see Staffans point of
>> too-much-complexity. So I will keep out of this discussion until the
>> real Reviewers decided what to do :)
>
> I have a hard time evaluating the merits of the patch as I don't work in an environment where this extra info is needed. But I take it on good faith that it is useful for the context Yasumasa describes.
I want to suggest to Java user where coredump is.
Modern Linux distribution(s) contains ABRT.
OS can dump corefile automatically despite a lack of setting coredump
resource by user.
I'm support engineer of Java. My customer says "coredump does not found.",
but coredump is saved by ABRT.
Thus I want them to know "coredump is available" through stderr and hs_err immediately.
I belive it is first step of troubleshoot.
Thanks,
Yasumasa
(2014/12/02 18:40), David Holmes wrote:
> On 1/12/2014 10:57 PM, Thomas Stüfe wrote:
>> Hi Yasumasa,
>>
>> On Mon, Dec 1, 2014 at 10:45 AM, Yasumasa Suenaga <yasuenag at gmail.com
>> <mailto:yasuenag at gmail.com>> wrote:
>>
>> Hi Thomas, David,
>>
>> Sorry, I didn't think about async signal safety.
>>
>> That would work, VmError::report_and_die() is singlethreaded. At
>> least the part which dumps out the core file name.
>>
>>
>> I think that signal handler (in this case) may run concurrency with
>> other thread.
>> If another thread calls malloc(3) in JNI, C Heap corruption may occur.
>>
>>
>> No, malloc(3) should be thread safe on our platforms. But this was not
>> the point. If I understood David right, he suggested using a static
>> buffer inside get_core_path() for assembling the core path, which would
>> make get_core_path() thread-unsafe (multiple threads calling it would
>> get garbled results). But as get_core_path() is only called from within
>> VmError::report_and_die() and that section is only ever executed by one
>> thread, Davids suggestion would still work.
>
> Yes that is what I was suggesting.
>
>> I want to rewrite a patch as below:
>>
>> - Use async signal safety functions.
>> fopen -> open, fgets -> read, etc.
>
> This is commendable if it is practical, but error reporting already does many, many things that are not async-signal safe, so there is no need to go to extreme measures here.
>
>> - Use O_BUFLEN for buffer size.
>> O_BUFLEN is defined to 2000 in ostream.hpp .
>> This macro is used in various points. VMError::coredump_message is
>> also defined with this value.
>>
>>
>> I think PATH_MAX is fine. I think O_BUFLEN was originally used as a max.
>> length of temporary buffers to assemble an output line. And then it
>> spread a bit. But your intend is to hold a path and using PATH_MAX
>> clearly documents this.
>> And, to really nitpick, right now you do not handle ERANGE with
>> get_current_path() (if the provided buffer is too small), which is
>> probably fine because it is improbable that a path is larger than
>> PATH_MAX. But if you change the size of the buffer to something which
>> may be smaller than PATH_MAX (O_BUFLEN), get_current_directory() may fail.
>>
>> I like your patch, I think it could be a nice time safer when
>> core_pattern is something unusual. But I also see Staffans point of
>> too-much-complexity. So I will keep out of this discussion until the
>> real Reviewers decided what to do :)
>
> I have a hard time evaluating the merits of the patch as I don't work in an environment where this extra info is needed. But I take it on good faith that it is useful for the context Yasumasa describes.
>
> David
>
>> Kind Regards, Thomas
>>
More information about the hotspot-runtime-dev
mailing list