RFR(S): 8074354: tests that intentionally crash the VM can timeout creating a core file

Yumin Qi yumin.qi at oracle.com
Tue Apr 14 19:54:50 UTC 2015


Thanks for many round reviews!

/Yumin

On 4/14/2015 12:40 PM, Daniel D. Daugherty wrote:
> On 4/14/15 8:42 AM, Yumin Qi wrote:
>> Dan,
>>
>> http://cr.openjdk.java.net/~minqi/8074354/webrev08/
>
> Thumbs up on this round.
>
>
> src/share/vm/runtime/globals.hpp
>     No comments.
>
> src/share/vm/runtime/os.hpp
>     No comments.
>
> src/share/vm/runtime/arguments.cpp
>     No comments.
>
> src/share/vm/utilities/vmError.hpp
>     No comments.
>
> src/share/vm/utilities/vmError.cpp
>     No comments.
>
> src/os/aix/vm/os_aix.cpp
> src/os/bsd/vm/os_bsd.cpp
> src/os/linux/vm/os_linux.cpp
> src/os/posix/vm/os_posix.cpp
> src/os/solaris/vm/os_solaris.cpp
>     No comments on the above five files.
>
> src/os/windows/vm/os_windows.cpp
>     No comments.
>
> test/runtime/ErrorHandling/ProblematicFrameTest.java
> test/runtime/ErrorHandling/SafeFetchInErrorHandlingTest.java
>     No comments on the above two files.
>
> test/runtime/ErrorHandling/SecondaryErrorTest.java
>     No comments.
>
> test/runtime/Safepoint/AssertSafepointCheckConsistency1.java
> test/runtime/Safepoint/AssertSafepointCheckConsistency2.java
> test/runtime/Safepoint/AssertSafepointCheckConsistency3.java
> test/runtime/Safepoint/AssertSafepointCheckConsistency4.java
> test/runtime/Unsafe/RangeCheck.java
> test/runtime/memory/ReadFromNoaccessArea.java
>     No comments on the above six files.
>
>
> Dan
>
>
>> Sorry missing the comment change. Now it is done.
>>
>> Thanks
>> Yumin
>>
>> On 4/14/2015 7:14 AM, Yumin Qi wrote:
>>> Dan,
>>>
>>>
>>>   I missed your comments, so will change again. Sorry for that.
>>>   Will update soon.
>>>
>>> Thanks
>>> Yumin
>>>
>>> On 4/13/2015 10:13 PM, Yumin Qi wrote:
>>>> Dan, Thanks.
>>>>
>>>> Changed to add CloseHandle(dumpFile) before all exit paths.
>>>> Please review at same link:
>>>>
>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev08/
>>>>
>>>> Yumin
>>>>
>>>>
>>>> On 4/13/2015 7:04 PM, Daniel D. Daugherty wrote:
>>>>> Yumin,
>>>>>
>>>>> I would prefer that the handle is properly closed on all the
>>>>> exit paths. Not closing the handle might even trigger a future
>>>>> Microsoft sanity check; kind of like when Microsoft added checks
>>>>> for duplicate close() calls...
>>>>>
>>>>> Dan
>>>>>
>>>>>
>>>>> On 4/13/15 4:05 PM, Yumin Qi wrote:
>>>>>> Dan,
>>>>>>
>>>>>> On 4/13/2015 2:09 PM, Daniel D. Daugherty wrote:
>>>>>>> On 4/13/15 10:58 AM, Yumin Qi wrote:
>>>>>>>> Thomas,
>>>>>>>>
>>>>>>>>   Answers embeded below. The new web is just the same link 
>>>>>>>> updated (08):
>>>>>>>>
>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev08/
>>>>>>>
>>>>>>> src/share/vm/runtime/globals.hpp
>>>>>>>     No comments.
>>>>>>>
>>>>>>> src/share/vm/runtime/os.hpp
>>>>>>>     L720: // ON Posix compatible OS it will
>>>>>>>         typo: 'ON' -> 'On'
>>>>>>>
>>>>>>>     L724: ... or a short error message, depends
>>>>>>>         grammar: 'depends' -> 'depending'
>>>>>>>
>>>>>>>     L725: // on checking result.
>>>>>>>         grammar: 'on checking' -> 'on the checking'
>>>>>>>
>>>>>>> src/share/vm/runtime/arguments.cpp
>>>>>>>     No comments.
>>>>>>>
>>>>>>> src/share/vm/utilities/vmError.hpp
>>>>>>>     No comments.
>>>>>>>
>>>>>>> src/share/vm/utilities/vmError.cpp
>>>>>>>     No comments.
>>>>>>>
>>>>>>> src/os/aix/vm/os_aix.cpp
>>>>>>> src/os/bsd/vm/os_bsd.cpp
>>>>>>> src/os/linux/vm/os_linux.cpp
>>>>>>> src/os/posix/vm/os_posix.cpp
>>>>>>> src/os/solaris/vm/os_solaris.cpp
>>>>>>>     No comments on the above five files.
>>>>>>>
>>>>>>> src/os/windows/vm/os_windows.cpp
>>>>>>>     L1010: jio_snprintf(buffer, buffsz, "Failed to create 
>>>>>>> coredump file (0x%x).", GetLastError());
>>>>>>>         Because this is a Win* specific file you can use "minidump"
>>>>>>>         here instead of "coredump".
>>>>>>>
>>>>>>>         I made a similar comment in the previous round.
>>>>>>>
>>>>>> Yes, I will change 'coredump' into 'minidump'
>>>>>>>     L1028: if (!dump_core || !dumpFile) {
>>>>>>>         The "!dumpFile" part is an implied boolean which we don't
>>>>>>>         like to use in HotSpot. Perhaps: dumpFile == NULL
>>>>>>>
>>>>>> Will change to Hotspot style.
>>>>>>>     L1078: win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
>>>>>>>         The "CloseHandle(dumpFile)" call is missing.
>>>>>>>
>>>>>> There is no need to call CloseHandle here explicitly, since we 
>>>>>> will exit next and all resources will be reclaimed by OS. I 
>>>>>> remove it at last since think it is not needed here. If you check 
>>>>>> previous calls to
>>>>>>   win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
>>>>>>   I did not place CloseHandle(dumpFile) either.
>>>>>>   If needed, I think we should put the call before all exit entry.
>>>>>>> test/runtime/ErrorHandling/ProblematicFrameTest.java
>>>>>>> test/runtime/ErrorHandling/SafeFetchInErrorHandlingTest.java
>>>>>>>     No comments on the above two files.
>>>>>>>
>>>>>>> test/runtime/ErrorHandling/SecondaryErrorTest.java
>>>>>>>     No comments.
>>>>>>>
>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency1.java
>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency2.java
>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency3.java
>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency4.java
>>>>>>> test/runtime/Unsafe/RangeCheck.java
>>>>>>> test/runtime/memory/ReadFromNoaccessArea.java
>>>>>>>     No comments on the above six files.
>>>>>> Thanks
>>>>>> Yumin
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Dan
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> Yumin
>>>>>>>>
>>>>>>>> On 4/13/2015 12:30 AM, Thomas Stüfe wrote:
>>>>>>>>> Hi Yumin,
>>>>>>>>>
>>>>>>>>> some small things:
>>>>>>>>>
>>>>>>>>> os_windows.cpp:1012
>>>>>>>>>
>>>>>>>>> +    if (dumpFile == INVALID_HANDLE_VALUE) {
>>>>>>>>> +      jio_snprintf(buffer, buffsz, "Failed to create coredump 
>>>>>>>>> file");
>>>>>>>>> +      status = false;
>>>>>>>>> +    }
>>>>>>>>>
>>>>>>>>> Please print out the error number too:
>>>>>>>>> +      jio_snprintf(buffer, buffsz, "Failed to create coredump 
>>>>>>>>> file (0x%x).", ::GetLastError());
>>>>>>>>>
>>>>>>>>>
>>>>>>>> Changed as above. No :: global scope operator needed here.
>>>>>>>>>
>>>>>>>>> os_windows.cpp:1036
>>>>>>>>>
>>>>>>>>> +  assert(dumpFile != NULL, "dumpFile should not be NULL");
>>>>>>>>>
>>>>>>>>> Please remove this assert. I would not do any asserts at this 
>>>>>>>>> stage, we are dying anyway and a recursive assert would just 
>>>>>>>>> confuse things. Moreover, CreateFile may have failed for 
>>>>>>>>> "normal" reasons.
>>>>>>>>>
>>>>>>>> removed.
>>>>>>>>> Instead, if dumpFile is NULL, just skip the whole minidump 
>>>>>>>>> stuff in os::abort; just behave the same way as for 
>>>>>>>>> os::abort(false):
>>>>>>>>>
>>>>>>>>> +  if (!dump_core || !dumpFile) {
>>>>>>>>> + win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
>>>>>>>>>    }
>>>>>>>>>
>>>>>>>>>
>>>>>>>> changed as expected.
>>>>>>>>>
>>>>>>>>> os_windows.cpp: 1076
>>>>>>>>>
>>>>>>>>> I would just skip the whole "FormatMessage" stuff. It is just 
>>>>>>>>> sugar, but it will allocate buffers, which we may not want at 
>>>>>>>>> this stage. I think the plain error code from GetLastError() 
>>>>>>>>> is sufficient here. So I would just:
>>>>>>>>>
>>>>>>>>> 1076   // Older versions of dbghelp.dll (the one shipped with 
>>>>>>>>> Win2003 for example) may not support all
>>>>>>>>> 1077   // the dump types we really want. If first call fails, 
>>>>>>>>> lets fall back to just use MiniDumpWithFullMemory then.
>>>>>>>>> 1078   if (_MiniDumpWriteDump(hProcess, processId, dumpFile, 
>>>>>>>>> dumpType, pmei, NULL, NULL) == false &&
>>>>>>>>> 1079       _MiniDumpWriteDump(hProcess, processId, dumpFile, 
>>>>>>>>> (MINIDUMP_TYPE)MiniDumpWithFullMemory, pmei, NULL, NULL) == 
>>>>>>>>> false) {
>>>>>>>>>          jio_fprintf(stderr, "Call to MiniDumpWriteDump() 
>>>>>>>>> failed (Error 0x%x)\n", ::GetLastError());
>>>>>>>>> 1089   } else {
>>>>>>>>> 1090    ....
>>>>>>>>>
>>>>>>>>>
>>>>>>>> Agree, this is the last step before exit, with output of last 
>>>>>>>> error code, user can get what happened --- though a little 
>>>>>>>> effort to research.
>>>>>>>>
>>>>>>>>> Rest is fine.
>>>>>>>>> Thomas
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Mon, Apr 13, 2015 at 7:59 AM, Yumin Qi <yumin.qi at oracle.com 
>>>>>>>>> <mailto:yumin.qi at oracle.com>> wrote:
>>>>>>>>>
>>>>>>>>>     Thomas and Dan,
>>>>>>>>>
>>>>>>>>>       Please review the changes at
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev08/
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev08/>
>>>>>>>>>
>>>>>>>>>     Thanks
>>>>>>>>>     Yumin
>>>>>>>>>
>>>>>>>>>     On 4/10/2015 10:14 PM, Yumin Qi wrote:
>>>>>>>>>
>>>>>>>>>         Thomas,
>>>>>>>>>
>>>>>>>>>         Thanks for review again.
>>>>>>>>>
>>>>>>>>>         On 4/10/2015 4:20 AM, Thomas Stüfe wrote:
>>>>>>>>>
>>>>>>>>>             Hi Yumin,
>>>>>>>>>
>>>>>>>>>             Hi Yumin,
>>>>>>>>>
>>>>>>>>>             this looks mostly fine for me. I only was able to 
>>>>>>>>> test
>>>>>>>>>             it on Linux, but will test it on other OSes next 
>>>>>>>>> week.
>>>>>>>>>
>>>>>>>>>             Here two remaining small points:
>>>>>>>>>
>>>>>>>>>             - in os::check_dump_limit, maybe a comment would be
>>>>>>>>>             helpful, because the contract for this function is a
>>>>>>>>>             bit difficult to understand. Proposal:
>>>>>>>>>
>>>>>>>>>             "Check or prepare a core dump to be taken at a later
>>>>>>>>>             point in the same thread in os::abort(). Use the
>>>>>>>>>             caller provided buffer as a scratch buffer. Output
>>>>>>>>>             status message via VMError::report_cordedump_status()
>>>>>>>>>             (on success, the core dump file location, on error, a
>>>>>>>>>             short error message) - this status message which will
>>>>>>>>>             be written into the error log."
>>>>>>>>>
>>>>>>>>>         I will take the comments, new comments:
>>>>>>>>>
>>>>>>>>>           // ON Posix compatible OS it will simply check core 
>>>>>>>>> dump
>>>>>>>>>         limits while on Windows
>>>>>>>>>           // it will check if dump file can be created. Check or
>>>>>>>>>         prepare a core dump to be
>>>>>>>>>           // taken at a later point in the same thread in
>>>>>>>>>         os::abort(). Use the caller
>>>>>>>>>           // provided buffer as a scratch buffer. The status
>>>>>>>>>         message which will be written
>>>>>>>>>           // into the error log either is file location or a 
>>>>>>>>> short
>>>>>>>>>         error message, depends
>>>>>>>>>           // on checking result.
>>>>>>>>>           static void check_dump_limit(char* buffer, size_t
>>>>>>>>>         bufferSize);
>>>>>>>>>
>>>>>>>>>             - It would make sense to improve the output in
>>>>>>>>>             VMError.report() in STEP(63) a bit:
>>>>>>>>>
>>>>>>>>>             Problem 1: we use past-tense, which is misleading
>>>>>>>>>             ("Core dump written", "Failed to write core"). We did
>>>>>>>>>             not generate the core dump yet, we just plan to do 
>>>>>>>>> it,
>>>>>>>>>             and it still may fail for various reasons (e.g. even
>>>>>>>>>             if the limits are fine, the current directory may be
>>>>>>>>>             write protected. There is no way to catch all errors
>>>>>>>>>             beforehand). If the user reads "Core dump 
>>>>>>>>> written", he
>>>>>>>>>             assumes the core dump was written successfully. If
>>>>>>>>>             abort(3) later fails to write the core dump, user 
>>>>>>>>> will
>>>>>>>>>             be confused.
>>>>>>>>>
>>>>>>>>>         Will change the message to
>>>>>>>>>               if (coredump_status) {
>>>>>>>>>                 st->print("Core dump will be written. %s",
>>>>>>>>>         coredump_message);
>>>>>>>>>               } else {
>>>>>>>>>                 st->print("No core dump will be written. %s",
>>>>>>>>>         coredump_message);
>>>>>>>>>               }
>>>>>>>>>
>>>>>>>>>         as your suggested.
>>>>>>>>>         Whether the coredump can be successfully created depends
>>>>>>>>>         on following core file generation procedure. User can
>>>>>>>>>         trace error messages if failed to create.
>>>>>>>>>
>>>>>>>>>             Problem 2: this is more obscure: on Linux core dumps
>>>>>>>>>             may not be written to the file system at all but be
>>>>>>>>>             processed by some other program. On my Ubuntu 14.4
>>>>>>>>>             machine I see this output:
>>>>>>>>>
>>>>>>>>>             #
>>>>>>>>>             # Core dump written. Default location: Core dumps may
>>>>>>>>>             be processed with "/usr/share/apport/apport %p %s %c
>>>>>>>>>             %P" (or dumping to
>>>>>>>>> /shared/projects/openjdk/jdk9-hs-rt/output/core.26261)
>>>>>>>>>             #
>>>>>>>>>
>>>>>>>>>             This output is a bit jarring.
>>>>>>>>>
>>>>>>>>>         I have not tested on Ubuntu so no comments.
>>>>>>>>>
>>>>>>>>>         I will post a new webrev based on your and Dan's 
>>>>>>>>> comments.
>>>>>>>>>         Thanks for your patience.
>>>>>>>>>
>>>>>>>>>         Thanks
>>>>>>>>>         Yumin
>>>>>>>>>
>>>>>>>>>             My suggestion for better texts would be:
>>>>>>>>>
>>>>>>>>>             "Core dump will be written. %s"
>>>>>>>>>             "No core dump will be written. %s"
>>>>>>>>>
>>>>>>>>>             which hopefully fits all cases better. But I don't
>>>>>>>>>             know, other suggestions are welcome :-)
>>>>>>>>>
>>>>>>>>>             Otherwise, this looks fine.
>>>>>>>>>
>>>>>>>>>             Thanks for your work!
>>>>>>>>>
>>>>>>>>>             Thomas
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             On Fri, Apr 10, 2015 at 5:18 AM, Yumin Qi
>>>>>>>>>             <yumin.qi at oracle.com <mailto:yumin.qi at oracle.com>
>>>>>>>>>             <mailto:yumin.qi at oracle.com
>>>>>>>>> <mailto:yumin.qi at oracle.com>>> wrote:
>>>>>>>>>
>>>>>>>>>                 Hi, Thomas and Dan
>>>>>>>>>
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev07/
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>>
>>>>>>>>>                 On 4/9/2015 7:51 PM, Yumin Qi wrote:
>>>>>>>>>
>>>>>>>>>                     Please hold on, I missed the test cases:
>>>>>>>>>
>>>>>>>>> *test/runtime/Unsafe/RangeCheck.java
>>>>>>>>>                     *
>>>>>>>>> *test/runtime/memory/ReadFromNoaccessArea.java
>>>>>>>>>
>>>>>>>>>                 Added.
>>>>>>>>>
>>>>>>>>>                     Also some file heads need to be updated with
>>>>>>>>>             this year.
>>>>>>>>>
>>>>>>>>>                 Changed
>>>>>>>>>
>>>>>>>>>                 Thanks
>>>>>>>>>                 Yumin
>>>>>>>>>
>>>>>>>>>                     Thanks
>>>>>>>>>                     Yumin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                     *
>>>>>>>>>                     On 4/9/2015 7:07 PM, Yumin Qi wrote:
>>>>>>>>>
>>>>>>>>>                         Hi, Thomas and Dan
>>>>>>>>>
>>>>>>>>>                           The same URL is updated with new 
>>>>>>>>> version.
>>>>>>>>>
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev07/
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>>
>>>>>>>>>                           I remove the public access to 
>>>>>>>>> VMError::out,
>>>>>>>>>                         VMError::coredump_message and the size of
>>>>>>>>>                         VMError::coredump_message.
>>>>>>>>>                           Added private static HANDLE in
>>>>>>>>>             os_windows.cpp for
>>>>>>>>>                         dumpFile as suggested by Thomas.
>>>>>>>>>
>>>>>>>>>                           Tests passes JPRT and manual tests.
>>>>>>>>>
>>>>>>>>>                         Thanks
>>>>>>>>>                         Yumin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                         On 4/9/2015 1:32 AM, Thomas Stüfe wrote:
>>>>>>>>>
>>>>>>>>>                             Hi Yumin,
>>>>>>>>>
>>>>>>>>>                             I do not think exposing
>>>>>>>>>             VMError::coredump_status
>>>>>>>>>                             buffer just for the sake of using it
>>>>>>>>>             as a scratch
>>>>>>>>>                             buffer in os::abort() is a good idea.
>>>>>>>>>             It is very
>>>>>>>>>                             confusing and has nothing to do with
>>>>>>>>>             the purpose of
>>>>>>>>> VMerror::coredump_status.
>>>>>>>>>
>>>>>>>>>                             Also, VMerror::coredump_status is
>>>>>>>>>             static, so you do
>>>>>>>>>                             not even gain anything over just 
>>>>>>>>> using
>>>>>>>>>             a global or
>>>>>>>>>                             function scope static buffer. Either
>>>>>>>>>             we are worried
>>>>>>>>>                             about thread safety in 
>>>>>>>>> os::abort(), or
>>>>>>>>>             we aren't. If
>>>>>>>>>                             we aren't, just use a local static
>>>>>>>>>             buffer, it is much
>>>>>>>>>                             clearer and no need to expose
>>>>>>>>>             VMError::coredump_status
>>>>>>>>>                             like this.
>>>>>>>>>
>>>>>>>>>                             Apart from that, see my remarks in
>>>>>>>>>             yesterdays mail.
>>>>>>>>>
>>>>>>>>>                             Cheers, Thomas
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                             On Thu, Apr 9, 2015 at 5:16 AM, 
>>>>>>>>> Yumin Qi
>>>>>>>>> <yumin.qi at oracle.com
>>>>>>>>>             <mailto:yumin.qi at oracle.com>
>>>>>>>>>             <mailto:yumin.qi at oracle.com 
>>>>>>>>> <mailto:yumin.qi at oracle.com>>
>>>>>>>>> <mailto:yumin.qi at oracle.com
>>>>>>>>>             <mailto:yumin.qi at oracle.com>
>>>>>>>>> <mailto:yumin.qi at oracle.com
>>>>>>>>> <mailto:yumin.qi at oracle.com>>>> wrote:
>>>>>>>>>
>>>>>>>>>                                 Hi, Dan
>>>>>>>>>
>>>>>>>>>                                   New webrev at
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev07/
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev07/>
>>>>>>>>>
>>>>>>>>>                                   To make code clean, add
>>>>>>>>>             os::abort_internal which
>>>>>>>>>                             is only used
>>>>>>>>>                                 for Windows.
>>>>>>>>>                                   Since passing
>>>>>>>>>             VMError::coredump_message and its
>>>>>>>>>                             size as
>>>>>>>>>                                 parameters across multiple
>>>>>>>>>             functions makes
>>>>>>>>>                             function have a bigger
>>>>>>>>>                                 signature, I change the way to
>>>>>>>>>             access them -- add
>>>>>>>>>                             two functions in
>>>>>>>>>                                 VMError to access them:
>>>>>>>>>             coredump_msg_buffer() and
>>>>>>>>> coredump_msg_buffer_size(). They
>>>>>>>>>             are static
>>>>>>>>>                             members, so can save
>>>>>>>>>                                 stack space for passing around.
>>>>>>>>>
>>>>>>>>>                                   in os_windows.cpp, abort(bool,
>>>>>>>>>             void*, void*):
>>>>>>>>>                                   if error encountered, exit with
>>>>>>>>>             error messages.
>>>>>>>>>                                   If no error,
>>>>>>>>>             VMError::coredump_message contains
>>>>>>>>>                             the dump
>>>>>>>>>                                 path/name. I just use them so no
>>>>>>>>>             need to have
>>>>>>>>>                             extra space for name
>>>>>>>>>                                 allocation.
>>>>>>>>>
>>>>>>>>>                                   Passed JPRT and manual tests.
>>>>>>>>>
>>>>>>>>>                                   Thanks
>>>>>>>>>                                   Yumin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                                 On 4/7/2015 9:23 AM, Daniel D.
>>>>>>>>>             Daugherty wrote:
>>>>>>>>>
>>>>>>>>>                                     On 4/1/15 10:57 AM, Yumin Qi
>>>>>>>>>             wrote:
>>>>>>>>>
>>>>>>>>>                                       Hi, Dan and Thomas,
>>>>>>>>>
>>>>>>>>>                                           I have a new webrev at
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev06/
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev06/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev06/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev06/>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             src/share/vm/runtime/globals.hpp
>>>>>>>>>                                         Sorry, I didn't notice
>>>>>>>>>             this before:
>>>>>>>>>
>>>>>>>>>                                         L939: product(bool,
>>>>>>>>>             CreateCoredumpOnCrash,
>>>>>>>>>                                     true, \
>>>>>>>>>                                         L940: "Create minidump on
>>>>>>>>>             VM fatal
>>>>>>>>>                                     error") \
>>>>>>>>>
>>>>>>>>>                                             The "minidump" on 
>>>>>>>>> L940
>>>>>>>>>             should change
>>>>>>>>>                                 also. Don't know if you
>>>>>>>>>                                             want to say 
>>>>>>>>> "core/mini
>>>>>>>>>             dump" or
>>>>>>>>>                                 something else.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             src/share/vm/runtime/os.hpp
>>>>>>>>>                                         L719:   // On
>>>>>>>>>             Linux/Solaris it will simply
>>>>>>>>>                                 check core dump
>>>>>>>>>                                     limits while on Windows will
>>>>>>>>>             do nothing.
>>>>>>>>> grammar: 'on Windows
>>>>>>>>>             will do nothing'
>>>>>>>>> -> 'on Windows
>>>>>>>>>             it will do nothing'
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             src/share/vm/runtime/arguments.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>>             src/share/vm/utilities/vmError.hpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>>             src/share/vm/utilities/vmError.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>> src/os/aix/vm/os_aix.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>> src/os/bsd/vm/os_bsd.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>>             src/os/linux/vm/os_linux.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>>             src/os/posix/vm/os_posix.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>>             src/os/solaris/vm/os_solaris.cpp
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>>             src/os/windows/vm/os_windows.cpp
>>>>>>>>>                                         L92: jio_snprintf(buffer,
>>>>>>>>>             bufferSize,
>>>>>>>>> "%s\\hs_err_pid%u.mdmp",
>>>>>>>>> get_current_directory(NULL, 0),
>>>>>>>>> current_process_id());
>>>>>>>>>                                             Other non-Windows 
>>>>>>>>> calls to
>>>>>>>>> get_current_directory() do a NULL
>>>>>>>>>                                             check before using 
>>>>>>>>> the
>>>>>>>>>             return value.
>>>>>>>>>                                 The original Windows
>>>>>>>>>                                             code that called
>>>>>>>>> get_current_directory() did not
>>>>>>>>>             make this
>>>>>>>>>                                             check, but I think
>>>>>>>>>             it's better to be
>>>>>>>>>                                 consistent and safe.
>>>>>>>>>
>>>>>>>>>                                         L1007: static char
>>>>>>>>>             buffer[O_BUFLEN];
>>>>>>>>>                                         L1008: char
>>>>>>>>>             filename[FILENAME_MAX];
>>>>>>>>>                                             Two more potentially
>>>>>>>>>             large stack
>>>>>>>>>                                 variables here. Will we
>>>>>>>>>                                             run into stack
>>>>>>>>>             overflow on Win* more
>>>>>>>>>                                 frequently when what
>>>>>>>>>                                             we really wanted was
>>>>>>>>>             the reason for
>>>>>>>>>                                 the abort() call?
>>>>>>>>>
>>>>>>>>>                                             The reason the
>>>>>>>>>             original code used
>>>>>>>>>                                 'buffer' to construct the
>>>>>>>>>                                             dump file name was to
>>>>>>>>>             save space. The
>>>>>>>>>                                 original code was also
>>>>>>>>> careful to not need
>>>>>>>>>             the file name in
>>>>>>>>>                                 any error messages after
>>>>>>>>>                                             the point at which 
>>>>>>>>> the
>>>>>>>>>             dump file was
>>>>>>>>>                                 successfully created.
>>>>>>>>>
>>>>>>>>>                                             It would be better
>>>>>>>>>             (more resilient) if
>>>>>>>>>                                 you could pass in
>>>>>>>>>                                             an already existing
>>>>>>>>>             buffer to abort()
>>>>>>>>>                                 like the original
>>>>>>>>>                                             code passed into
>>>>>>>>> os::check_or_create_dump(). Yes, that
>>>>>>>>>                                             would require 
>>>>>>>>> visiting
>>>>>>>>>             all existing
>>>>>>>>>                                 calls to abort().
>>>>>>>>>
>>>>>>>>>                                         L1015: 
>>>>>>>>> assert(out->is_open(),
>>>>>>>>>                                 "defaultStream should be open");
>>>>>>>>>                                             Is it possible for
>>>>>>>>>             os::abort() to be
>>>>>>>>>                                 called early enough on
>>>>>>>>> Windows such that
>>>>>>>>>             VMError::out is not
>>>>>>>>>                                 actually setup? Yes,
>>>>>>>>>                                             this would have to be
>>>>>>>>>             absolutely
>>>>>>>>>                                 catastrophic...
>>>>>>>>>
>>>>>>>>>                                             See the comment in
>>>>>>>>>             os_solaris.cpp
>>>>>>>>>                                 L1520-1522.
>>>>>>>>>
>>>>>>>>>                                         L1018: 
>>>>>>>>> jio_snprintf(buffer,
>>>>>>>>>                                 sizeof(buffer), "%s", "Either
>>>>>>>>> CreateCoredumpOnCrash is
>>>>>>>>>             disabled from command"
>>>>>>>>>                                         L1019   " line or 
>>>>>>>>> coredump
>>>>>>>>>                                 is not available");
>>>>>>>>>                                             When you are using
>>>>>>>>>             jio_snprintf() as a
>>>>>>>>>                                 replacement for:
>>>>>>>>>
>>>>>>>>>             strncpy(buffer, "my string",
>>>>>>>>>                                 sizeof(buffer));
>>>>>>>>>             buffer[sizeof(buffer) - 1] = '\0';
>>>>>>>>>
>>>>>>>>>                                             you don't need the
>>>>>>>>>             "%s" format string.
>>>>>>>>>                                 So this code would be:
>>>>>>>>>
>>>>>>>>>             jio_snprintf(buffer, sizeof(buffer),
>>>>>>>>>              "Either
>>>>>>>>> CreateCoredumpOnCrash is disabled
>>>>>>>>>             from "
>>>>>>>>>              "command line or coredump
>>>>>>>>>                                 is not available");
>>>>>>>>>
>>>>>>>>>                                             Same comment for:
>>>>>>>>>             L1026, L1039
>>>>>>>>>
>>>>>>>>>                                         L1020: goto done;
>>>>>>>>>                                             The use of 'goto'
>>>>>>>>>             makes me cringe. You
>>>>>>>>>                                 can refactor much
>>>>>>>>>                                             of this logic into an
>>>>>>>>>             abort_internal()
>>>>>>>>>                                 function that
>>>>>>>>> abort() calls and keep
>>>>>>>>>             all the
>>>>>>>>>                                 original "return" logic
>>>>>>>>>                                             to bail out.
>>>>>>>>>
>>>>>>>>>                                         L1045: // Older versions
>>>>>>>>>             of dbghelp.h
>>>>>>>>>                                 doesn't contain all
>>>>>>>>> grammar: 'doesn't' ->
>>>>>>>>>             'do not'
>>>>>>>>>
>>>>>>>>>                                         L1052: cwd =
>>>>>>>>>             get_current_directory(NULL, 0);
>>>>>>>>>                                         L1053: 
>>>>>>>>> jio_snprintf(filename,
>>>>>>>>>                                 sizeof(filename),
>>>>>>>>> "%s\\hs_err_pid%u.mdmp", cwd,
>>>>>>>>> current_process_id());
>>>>>>>>>                                             Other non-Windows 
>>>>>>>>> calls to
>>>>>>>>> get_current_directory() do a NULL
>>>>>>>>>                                             check before using 
>>>>>>>>> the
>>>>>>>>>             return value.
>>>>>>>>>                                 The original Windows
>>>>>>>>>                                             code that called
>>>>>>>>> get_current_directory() did not
>>>>>>>>>             make this
>>>>>>>>>                                             check, but I think
>>>>>>>>>             it's better to be
>>>>>>>>>                                 consistent and safe.
>>>>>>>>>
>>>>>>>>>                                         L1092: // well done.
>>>>>>>>>                                             Like a overcooked
>>>>>>>>>             steak? :-) Not sure
>>>>>>>>>                                 what you're trying
>>>>>>>>>                                             to say here...
>>>>>>>>>
>>>>>>>>> test/runtime/ErrorHandling/ProblematicFrameTest.java
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/ErrorHandling/SafeFetchInErrorHandlingTest.java
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/ErrorHandling/SecondaryErrorTest.java
>>>>>>>>>                                         No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency1.java
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency2.java
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency3.java
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency4.java
>>>>>>>>>                                         No comments on these 
>>>>>>>>> four.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                                     Dan
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                                           What changes:
>>>>>>>>>
>>>>>>>>>                                            1) os_windows.cpp,
>>>>>>>>>             os::abort(bool ....):
>>>>>>>>>                                               a) Since when
>>>>>>>>>             abort() is called, the
>>>>>>>>>                                     last function called
>>>>>>>>>             before exit process,
>>>>>>>>>                                     VMError::log already 
>>>>>>>>> closed, which
>>>>>>>>>                                         is the file logging.
>>>>>>>>>             defaultStream still
>>>>>>>>>                                     available to use, so
>>>>>>>>>                                         use it for writing error
>>>>>>>>>             or success
>>>>>>>>>                                     messages. VMError::out is
>>>>>>>>>                                         the defaultStream, for
>>>>>>>>>             using it, added a
>>>>>>>>>                                     function out_stream()  in 
>>>>>>>>> VMError.
>>>>>>>>>                                               b) Delete the codes
>>>>>>>>>             which decide to
>>>>>>>>>                                     write core based on
>>>>>>>>> client/server version with
>>>>>>>>>             debug. The new
>>>>>>>>>                                     code is if
>>>>>>>>>             CreateCoredumpOnCrash set or dump_core is
>>>>>>>>>                                     on, the coredump will
>>>>>>>>>                                         be tried no matter which
>>>>>>>>>             version it is.
>>>>>>>>>                                     There is no special
>>>>>>>>>                                         reason not to dump core
>>>>>>>>>             with client
>>>>>>>>>                                     version I think. Any concern
>>>>>>>>>                                         for this change?
>>>>>>>>>                                               c) Use of 'goto' in
>>>>>>>>>             this function. I
>>>>>>>>>                                     tried not to use it,
>>>>>>>>>                                         but using it makes code
>>>>>>>>>             clear. I remember
>>>>>>>>>                                     somewhere suggest not
>>>>>>>>>                                         using 'goto' in 
>>>>>>>>> cplusplus.
>>>>>>>>>
>>>>>>>>>                                             2) changed 
>>>>>>>>> comments to
>>>>>>>>>             make them
>>>>>>>>>                                     consistent as indicated by 
>>>>>>>>> Dan.
>>>>>>>>>
>>>>>>>>>                                             3) Added/modified 
>>>>>>>>> head
>>>>>>>>>             version for files.
>>>>>>>>>
>>>>>>>>>                                             Tests: JPRT, manual
>>>>>>>>>             test on local Windows.
>>>>>>>>>
>>>>>>>>>                                         Thanks
>>>>>>>>>                                         Yumin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                                         On 3/31/2015 1:25 AM,
>>>>>>>>>             Thomas Stüfe wrote:
>>>>>>>>>
>>>>>>>>>                                             Hi Daniel, Yumin,
>>>>>>>>>
>>>>>>>>>                                             sorry, a lot of 
>>>>>>>>> Yumins
>>>>>>>>>             changes were
>>>>>>>>>                                         based on suggestions from
>>>>>>>>>                                             me, so here more
>>>>>>>>>             background:
>>>>>>>>>
>>>>>>>>>                                             Yumin reversed the
>>>>>>>>>             order of error log
>>>>>>>>>                                         writing and core dumping.
>>>>>>>>>                                             The reason for that
>>>>>>>>>             are explained in
>>>>>>>>>                                         detail at the start of 
>>>>>>>>> the
>>>>>>>>>                                             mail thread, in 
>>>>>>>>> short:
>>>>>>>>>
>>>>>>>>>                                             - on Windows core 
>>>>>>>>> file
>>>>>>>>>             dumping may
>>>>>>>>>                                         hang - its rare but it
>>>>>>>>> happens - preventing
>>>>>>>>>             error logs.
>>>>>>>>>                                         Depending on who you ask,
>>>>>>>>>                                             error logs are more
>>>>>>>>>             important than
>>>>>>>>>                                         minidumps, so it makes 
>>>>>>>>> sense
>>>>>>>>>                                             to first write the
>>>>>>>>>             erorr log.
>>>>>>>>>                                             - This also brings
>>>>>>>>>             windows core paths
>>>>>>>>>                                         closer to UNIX code
>>>>>>>>>                                             paths. See below.
>>>>>>>>>
>>>>>>>>>                                             About writing to
>>>>>>>>>             stderr in os::abort():
>>>>>>>>>
>>>>>>>>>                                             After this change, 
>>>>>>>>> calling
>>>>>>>>>             VmError::report_coredump_status() in
>>>>>>>>> os::abort() will not
>>>>>>>>>             do anything
>>>>>>>>>                                         because the error log is
>>>>>>>>> already written at
>>>>>>>>>             that point. I
>>>>>>>>>                                         suggested to Yumin 
>>>>>>>>> writing to
>>>>>>>>>                                             stderr instead in
>>>>>>>>>             os::abort() because
>>>>>>>>>                                         that mimicks UNIX
>>>>>>>>> behaviour: On UNIX,
>>>>>>>>>             you call abort(3),
>>>>>>>>>                                         which writes a core and
>>>>>>>>> aborts. It writes a
>>>>>>>>>             short message to
>>>>>>>>>                                         stderr "Aborted (core
>>>>>>>>> dumped)" or just
>>>>>>>>>             "Aborted".
>>>>>>>>>
>>>>>>>>>                                             After Yumins change,
>>>>>>>>>             on Windows
>>>>>>>>>                                         os::abort also writes the
>>>>>>>>>             core,
>>>>>>>>>                                             then aborts. It made
>>>>>>>>>             sense to me that
>>>>>>>>>                                         this function should
>>>>>>>>>                                             behave the same 
>>>>>>>>> way as
>>>>>>>>>             on UNIX: if
>>>>>>>>>                                         core writing fails, 
>>>>>>>>> write to
>>>>>>>>> stderr. There is no
>>>>>>>>>             way otherwise to
>>>>>>>>> communicate a core dump
>>>>>>>>> writing failure. After
>>>>>>>>>             writing the
>>>>>>>>>                                         core, process stops.
>>>>>>>>>
>>>>>>>>>                                             ---
>>>>>>>>>
>>>>>>>>>                                             About the control 
>>>>>>>>> flows:
>>>>>>>>>
>>>>>>>>>                                             Before Yumins change:
>>>>>>>>>
>>>>>>>>>                                             On Windows
>>>>>>>>>                                             1)
>>>>>>>>>             os::check_or_create_dump(): we
>>>>>>>>>                                         wrote the core dump 
>>>>>>>>> and then
>>>>>>>>> information about the
>>>>>>>>>             dump (file
>>>>>>>>>                                         location, success or 
>>>>>>>>> error)
>>>>>>>>>                                             was handed to the 
>>>>>>>>> misnamed
>>>>>>>>>             VmError::report_coredump_status(),
>>>>>>>>>                                             which just stored 
>>>>>>>>> that
>>>>>>>>>             information.
>>>>>>>>>                                             2) VmError::report():
>>>>>>>>>             Error log was
>>>>>>>>>                                         written and in step 63
>>>>>>>>> information about the
>>>>>>>>>             core (already
>>>>>>>>>                                         written at that point) 
>>>>>>>>> was
>>>>>>>>>                                             added to error log.
>>>>>>>>>                                             3) os::abort() just
>>>>>>>>>             did an exit(3)
>>>>>>>>>
>>>>>>>>>                                             On Unix,
>>>>>>>>>                                             1)
>>>>>>>>>             os::check_or_create_dump(): checks
>>>>>>>>>                                         the limits to guess
>>>>>>>>> whether core dumping
>>>>>>>>>             later will
>>>>>>>>>                                         succeed. Again, that
>>>>>>>>> information is handed to
>>>>>>>>>             VmError::report_coredump_status()
>>>>>>>>>                                             2) VmError::report():
>>>>>>>>>             Error log is
>>>>>>>>>                                         written and in step 63,
>>>>>>>>> information about the
>>>>>>>>>             core's probable
>>>>>>>>>                                         future location is added
>>>>>>>>>                                             to error log. Here,
>>>>>>>>>             messages use past
>>>>>>>>>                                         tense, which is
>>>>>>>>> misleading, because
>>>>>>>>>             the core is not
>>>>>>>>>                                         yet written.
>>>>>>>>>                                             3) os::abort() calls
>>>>>>>>>             abort(3), which
>>>>>>>>>                                         stops and writes a core.
>>>>>>>>>
>>>>>>>>>                                             Yumin pushed core 
>>>>>>>>> file
>>>>>>>>>             writing on
>>>>>>>>>                                         Windows down to 
>>>>>>>>> os::abort().
>>>>>>>>>                                             This brings the
>>>>>>>>>             control flow much
>>>>>>>>>                                         closer to Unix:
>>>>>>>>>
>>>>>>>>>                                             (1) call
>>>>>>>>>             os::check_dump_limit() to
>>>>>>>>>                                         check the 
>>>>>>>>> prerequisites for
>>>>>>>>>                                             core file writing and
>>>>>>>>>             gather a bit
>>>>>>>>> information to put in the
>>>>>>>>>                                             error log: On Unix,
>>>>>>>>>             limit checks, on
>>>>>>>>>                                         windows, so far nothing
>>>>>>>>>                                             much but
>>>>>>>>>             precalculating the error file
>>>>>>>>>                                         name.
>>>>>>>>>                                             (2) 
>>>>>>>>> VmError::report():
>>>>>>>>>             Error log is
>>>>>>>>>                                         written and information
>>>>>>>>>                                             about the core's
>>>>>>>>>             probable location is
>>>>>>>>>                                         added to error log.
>>>>>>>>>                                             (3) os::abort() is
>>>>>>>>>             called, which on
>>>>>>>>>                                         all platforms:
>>>>>>>>>                                              - dumps the core
>>>>>>>>>                                              - if failing, writes
>>>>>>>>>             a one-liner to
>>>>>>>>>                                         stderr
>>>>>>>>>                                              - stops the process.
>>>>>>>>>
>>>>>>>>>                                             I think, if one 
>>>>>>>>> agrees
>>>>>>>>>             that reversing
>>>>>>>>>                                         order of core dumping and
>>>>>>>>>                                             error log writing on
>>>>>>>>>             windows is a good
>>>>>>>>>                                         thing, this change looks
>>>>>>>>>                                             ok to me. Some
>>>>>>>>>             improvements could make
>>>>>>>>>                                         it clearer:
>>>>>>>>>
>>>>>>>>>                                             - maybe rename
>>>>>>>>>             "os::check_dump_limit()" (was my suggestion,
>>>>>>>>>                                             sorry) to
>>>>>>>>>             "os::check_core_prerequisites()" - that
>>>>>>>>>                                         leaves room
>>>>>>>>>                                             to flesh it out a bit
>>>>>>>>>             more on Windows,
>>>>>>>>>                                         where we do not have
>>>>>>>>>                                             UNIX limits.
>>>>>>>>>                                             - make the 
>>>>>>>>> messages in
>>>>>>>>> VMError::report() future
>>>>>>>>>             sense: "Will
>>>>>>>>>                                             write core file to
>>>>>>>>>             location.....".
>>>>>>>>>                                             - Make the messages
>>>>>>>>>             written in
>>>>>>>>> os::abort() on Windows
>>>>>>>>>             clearer,
>>>>>>>>>                                             and shorter, and we
>>>>>>>>>             also do not need
>>>>>>>>>                                         the buffer to be static
>>>>>>>>>                                             here. Actually, if we
>>>>>>>>>             want to be as on
>>>>>>>>>                                         UNIX, just dumping "core
>>>>>>>>>                                             file writing
>>>>>>>>>             succeeded" or "failed" -
>>>>>>>>>                                         maybe with an error
>>>>>>>>>                                             number from
>>>>>>>>>             GetLastError() - will be
>>>>>>>>>                                         enough because the file
>>>>>>>>> location is already
>>>>>>>>>             printed in the
>>>>>>>>>                                         error log. Like on UNIX.
>>>>>>>>>
>>>>>>>>>                                             Kind Regards, Thomas
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                                             On Mon, Mar 30, 2015
>>>>>>>>>             at 9:51 PM,
>>>>>>>>>                                         Daniel D. Daugherty
>>>>>>>>> <daniel.daugherty at oracle.com
>>>>>>>>> <mailto:daniel.daugherty at oracle.com>
>>>>>>>>>             <mailto:daniel.daugherty at oracle.com
>>>>>>>>> <mailto:daniel.daugherty at oracle.com>>
>>>>>>>>>             <mailto:daniel.daugherty at oracle.com
>>>>>>>>> <mailto:daniel.daugherty at oracle.com>
>>>>>>>>>             <mailto:daniel.daugherty at oracle.com
>>>>>>>>> <mailto:daniel.daugherty at oracle.com>>>> wrote:
>>>>>>>>>
>>>>>>>>> Re:
>>>>>>>>>             report_coredump_status() is
>>>>>>>>>                                         really
>>>>>>>>>             record_coredump_status()
>>>>>>>>>
>>>>>>>>> The
>>>>>>>>>             report_coredump_status()
>>>>>>>>>                                         function is designed to
>>>>>>>>>             record two
>>>>>>>>> things about core
>>>>>>>>>             dumps for later
>>>>>>>>>                                         reporting by the code 
>>>>>>>>> that
>>>>>>>>> generates the
>>>>>>>>>             hs_err_pid file.
>>>>>>>>>                                         That's why the original
>>>>>>>>>             report_coredump_status() didn't
>>>>>>>>>                                         output anything to 
>>>>>>>>> stderr.
>>>>>>>>>
>>>>>>>>>                                                 By changing the
>>>>>>>>>             Windows calls to
>>>>>>>>>             report_coredump_status() into
>>>>>>>>>             jio_fprintf() calls you have:
>>>>>>>>>
>>>>>>>>>                                                 - put output onto
>>>>>>>>>             stderr that
>>>>>>>>>                                         should go to the
>>>>>>>>>             hs_err_pid file
>>>>>>>>>                                                 - made the 
>>>>>>>>> windows
>>>>>>>>>             code paths work
>>>>>>>>> differently than the
>>>>>>>>> non-windows
>>>>>>>>> code paths
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Dan
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                                                 On 3/30/15 1:28
>>>>>>>>>             PM, Yumin Qi wrote:
>>>>>>>>>
>>>>>>>>> Thanks Dan
>>>>>>>>>
>>>>>>>>> On 3/30/2015
>>>>>>>>>             11:25 AM, Daniel
>>>>>>>>>                                         D. Daugherty wrote:
>>>>>>>>>
>>>>>>>>> On 3/25/15
>>>>>>>>>             12:11 PM, Yumin
>>>>>>>>>                                         Qi wrote:
>>>>>>>>>
>>>>>>>>>             Hi, all
>>>>>>>>>
>>>>>>>>>                 I updated the
>>>>>>>>>                                         webrev with a new 
>>>>>>>>> change to
>>>>>>>>>             test case:
>>>>>>>>>             test/runtime/Unsafe/RangeCheck.java
>>>>>>>>>
>>>>>>>>>                 Add
>>>>>>>>>             -XX:-CreateCoredumpOnCrash to test, no
>>>>>>>>>             dump needed on this case.
>>>>>>>>>
>>>>>>>>>                 new  webrev:
>>>>>>>>> http://cr.openjdk.java.net/~minqi/8074354/webrev05/
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev05/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev05/>
>>>>>>>>> <http://cr.openjdk.java.net/%7Eminqi/8074354/webrev05/>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             General nit - please
>>>>>>>>>                                         update copyright lines 
>>>>>>>>> to 2015
>>>>>>>>> as needed
>>>>>>>>>
>>>>>>>>>             src/share/vm/runtime/globals.hpp
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             src/share/vm/runtime/os.hpp
>>>>>>>>>             line 720:   // On
>>>>>>>>>                                         Windows this will 
>>>>>>>>> create an
>>>>>>>>>             actual minidump, on
>>>>>>>>> Linux/Solaris it will simply
>>>>>>>>>             check core dump limits
>>>>>>>>>             line 721: static
>>>>>>>>>                                         void 
>>>>>>>>> check_dump_limit(char*
>>>>>>>>>             buffer, size_t bufferSize);
>>>>>>>>>                 The comment on
>>>>>>>>>                                         line 720 no longer 
>>>>>>>>> matches
>>>>>>>>> with the
>>>>>>>>>             function
>>>>>>>>>                 rename from
>>>>>>>>>             check_or_create_dump() to
>>>>>>>>>             check_dump_limit().
>>>>>>>>>
>>>>>>>>>                 You have this
>>>>>>>>>                                         comment in vmError.cpp:
>>>>>>>>>                 943     // check
>>>>>>>>>                                         core dump limits on
>>>>>>>>>             Linux/Solaris, nothing on
>>>>>>>>>                                         Windows
>>>>>>>>>                 944
>>>>>>>>>             os::check_dump_limit(buffer,
>>>>>>>>>             sizeof(buffer));
>>>>>>>>>
>>>>>>>>>                 so the two
>>>>>>>>>                                         comments are out of sync.
>>>>>>>>>
>>>>>>>>> Will convert
>>>>>>>>>             them to be
>>>>>>>>> consistent.
>>>>>>>>>
>>>>>>>>>             src/share/vm/runtime/arguments.cpp
>>>>>>>>>             line 3252: } else if
>>>>>>>>>             (match_option(option,
>>>>>>>>>             "-XX:+CreateMinidumpOnCrash", &tail)) {
>>>>>>>>>             line 3256: } else if
>>>>>>>>>             (match_option(option,
>>>>>>>>>             "-XX:-CreateMinidumpOnCrash", &tail)) {
>>>>>>>>>                 These two checks
>>>>>>>>>                                         should use the
>>>>>>>>>             match_option() version
>>>>>>>>>                 without a '&tail'
>>>>>>>>>                                         parameter.
>>>>>>>>>
>>>>>>>>> Will use
>>>>>>>>>             version w/o tail.
>>>>>>>>>
>>>>>>>>>             src/share/vm/utilities/vmError.cpp
>>>>>>>>>             line 217: bool
>>>>>>>>>             VMError::coredump_status =
>>>>>>>>>             true;       // presume we
>>>>>>>>>                                         can dump core file first
>>>>>>>>>                 I don't think you
>>>>>>>>>                                         should init this to true.
>>>>>>>>> It confuses
>>>>>>>>>                 things with
>>>>>>>>>             VMError::report_coredump_status(). It will
>>>>>>>>>                                         also
>>>>>>>>>                 confuse this code:
>>>>>>>>>
>>>>>>>>>                 526 STEP(63,
>>>>>>>>>                                         "(printing core file
>>>>>>>>>             information)")
>>>>>>>>>                 529       if
>>>>>>>>> (coredump_status) {
>>>>>>>>>                 530
>>>>>>>>> st->print("Core dump
>>>>>>>>>             written. Default
>>>>>>>>>             location: %s",
>>>>>>>>> coredump_message);
>>>>>>>>>
>>>>>>>>>                 because
>>>>>>>>> coredump_status won't
>>>>>>>>>             accurately
>>>>>>>>>             reflect whether
>>>>>>>>>                 the
>>>>>>>>> coredump_message field has
>>>>>>>>>             been set.
>>>>>>>>>
>>>>>>>>>             line 943: // check
>>>>>>>>>                                         core dump limits on
>>>>>>>>>             Linux/Solaris, nothing on
>>>>>>>>>                                         Windows
>>>>>>>>>                 This updated
>>>>>>>>>                                         comment doesn't match the
>>>>>>>>>             unmodified
>>>>>>>>>                 comment in os.hpp:
>>>>>>>>>
>>>>>>>>>                 720:   // On
>>>>>>>>>                                         Windows this will 
>>>>>>>>> create an
>>>>>>>>>             actual minidump, on
>>>>>>>>> Linux/Solaris it will simply
>>>>>>>>>             check core dump limits
>>>>>>>>>
>>>>>>>>> I will
>>>>>>>>>             consider your comments,
>>>>>>>>>                                         then revise with a new
>>>>>>>>> version. I
>>>>>>>>>             remember here there
>>>>>>>>>                                         is a case, if status not
>>>>>>>>> set, it will
>>>>>>>>>             output an
>>>>>>>>> inconsistent message. Will
>>>>>>>>>             check
>>>>>>>>> again.
>>>>>>>>>
>>>>>>>>>             src/os/aix/vm/os_aix.cpp
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             src/os/bsd/vm/os_bsd.cpp
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             src/os/linux/vm/os_linux.cpp
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             src/os/posix/vm/os_posix.cpp
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             src/os/solaris/vm/os_solaris.cpp
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             src/os/windows/vm/os_windows.cpp
>>>>>>>>>             line 1008: static char
>>>>>>>>> buffer[O_BUFLEN];
>>>>>>>>>                 Why switch from a
>>>>>>>>>                                         buffer parameter to a
>>>>>>>>>             static buffer?
>>>>>>>>>                 What happens with
>>>>>>>>>                                         parallel calls to
>>>>>>>>>             abort()? Will the static
>>>>>>>>>                 buffer get stomped
>>>>>>>>>                                         by the competing threads?
>>>>>>>>>
>>>>>>>>> The original
>>>>>>>>>             buffer is static
>>>>>>>>>                                         too. Carrying an buffer
>>>>>>>>> for abort
>>>>>>>>>             seems not right.
>>>>>>>>>                                         This buffer in fact 
>>>>>>>>> only for
>>>>>>>>> storing file
>>>>>>>>>             name (based on
>>>>>>>>>                                         pid) here.
>>>>>>>>> abort() will
>>>>>>>>>             dump the core
>>>>>>>>>                                         file, should we prevent
>>>>>>>>>             multi-thread calling to this
>>>>>>>>>                                         function? I did not check
>>>>>>>>> this part,
>>>>>>>>>             will check if it is
>>>>>>>>>                                         MT-safe.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             line 1015:   // If
>>>>>>>>>                                         running on a client 
>>>>>>>>> version
>>>>>>>>> of Windows
>>>>>>>>>             and user has
>>>>>>>>>                                         not explicitly enabled 
>>>>>>>>> dumping
>>>>>>>>>             line 1016:   if
>>>>>>>>>             (!os::win32::is_windows_server() &&
>>>>>>>>>             !CreateCoredumpOnCrash) {
>>>>>>>>>                 The default for
>>>>>>>>>             CreateCoredumpOnCrash is
>>>>>>>>> now 'true'
>>>>>>>>>             so the
>>>>>>>>>                 comment and logic
>>>>>>>>>                                         are no longer correct
>>>>>>>>>             here. The Windows
>>>>>>>>>                 Client VM will
>>>>>>>>>                                         generate minidumps by 
>>>>>>>>> default.
>>>>>>>>>
>>>>>>>>>             old line 1007:
>>>>>>>>> VMError::report_coredump_status("Minidumps
>>>>>>>>>                                         are not
>>>>>>>>>             enabled by default on
>>>>>>>>>                                         client versions of 
>>>>>>>>> Windows",
>>>>>>>>>             false);
>>>>>>>>>             new line 1017:
>>>>>>>>> jio_fprintf(stderr, "Minidumps
>>>>>>>>> are not
>>>>>>>>>             enabled by default
>>>>>>>>>                                         on client versions of
>>>>>>>>>             Windows.\n");
>>>>>>>>>                 There are a number
>>>>>>>>>                                         of places where we
>>>>>>>>>             change from
>>>>>>>>>             VMError::report_coredump_status() to
>>>>>>>>> jio_fprintf()
>>>>>>>>>                 and I'm not quite
>>>>>>>>>                                         seeing why this was done.
>>>>>>>>>
>>>>>>>>>                 Update:
>>>>>>>>>             VMError::report_coredump_status()
>>>>>>>>> is
>>>>>>>>>             misnamed. It doesn't
>>>>>>>>>                 report anything in
>>>>>>>>>                                         the sense that it
>>>>>>>>>             doesn't print anything. It
>>>>>>>>>                 does record two
>>>>>>>>>                                         pieces of information 
>>>>>>>>> about
>>>>>>>>> core dumps
>>>>>>>>>             so maybe
>>>>>>>>>                 it should be
>>>>>>>>>             VMError::record_coredump_status().
>>>>>>>>>
>>>>>>>>>             line 1100:
>>>>>>>>> jio_fprintf(stderr,
>>>>>>>>>             "%s.\n", buffer);
>>>>>>>>>                 At this point,
>>>>>>>>>                                         buffer contains the path
>>>>>>>>>             to the
>>>>>>>>>                 mini-dump file so
>>>>>>>>>                                         the above line simply 
>>>>>>>>> prints
>>>>>>>>>                 that on stderr. Why?
>>>>>>>>>
>>>>>>>>>                 Yes, I see that
>>>>>>>>>                                         the old code did 
>>>>>>>>> something
>>>>>>>>>             similar:
>>>>>>>>>
>>>>>>>>>                 1090
>>>>>>>>> VMError::report_coredump_status(buffer,
>>>>>>>>>                                         true);
>>>>>>>>>
>>>>>>>>>                 but
>>>>>>>>>             report_coredump_status() didn't
>>>>>>>>>             actually print
>>>>>>>>>                 anything. It just
>>>>>>>>>                                         squirreled away these in
>>>>>>>>>             vmError.cpp:
>>>>>>>>>
>>>>>>>>>                 217 bool
>>>>>>>>>             VMError::coredump_status;
>>>>>>>>>                 218 char
>>>>>>>>>             VMError::coredump_message[O_BUFLEN];
>>>>>>>>>
>>>>>>>>>                 See comments above
>>>>>>>>>                                         about how
>>>>>>>>>             report_coredump_status()
>>>>>>>>>                 is misnamed.
>>>>>>>>>
>>>>>>>>>             At this point, I'm
>>>>>>>>>                                         convinced that all the
>>>>>>>>>             changes from
>>>>>>>>>             VMError::report_coredump_status() to
>>>>>>>>> jio_fprintf() are
>>>>>>>>>             a bad idea.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Changing to
>>>>>>>>>             jio_fprintf is because
>>>>>>>>>             report_coredump_status did not
>>>>>>>>>                                         output anything, it is
>>>>>>>>> just a logging
>>>>>>>>>             as you
>>>>>>>>>                                         indicated. It is 
>>>>>>>>> reasonable we
>>>>>>>>> change it to
>>>>>>>>>             record_coredump_status instead. How about
>>>>>>>>> add printout to
>>>>>>>>>             report_coredump_status? So I do not
>>>>>>>>> need to use
>>>>>>>>>             jio_printf here.
>>>>>>>>>
>>>>>>>>> Other
>>>>>>>>>             consideration of using
>>>>>>>>> jio_fprintf after call
>>>>>>>>> shutdown
>>>>>>>>>             called, the static
>>>>>>>>>                                         output stream still 
>>>>>>>>> exists,
>>>>>>>>> but not
>>>>>>>>>             guaranteed to work as
>>>>>>>>>                                         expected.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> Yumin
>>>>>>>>>
>>>>>>>>> test/runtime/ErrorHandling/ProblematicFrameTest.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/ErrorHandling/SafeFetchInErrorHandlingTest.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/ErrorHandling/SecondaryErrorTest.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency1.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency2.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency3.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/Safepoint/AssertSafepointCheckConsistency4.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>             test/runtime/Unsafe/RangeCheck.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>> test/runtime/memory/ReadFromNoaccessArea.java
>>>>>>>>>             No comments.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             Thanks
>>>>>>>>>             Yumin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>             On 3/23/2015 11:48 AM,
>>>>>>>>>                                         Yumin Qi wrote:
>>>>>>>>>
>>>>>>>>>                 Since Thomas is
>>>>>>>>>                                         not a reviewer in open 
>>>>>>>>> jdk,
>>>>>>>>>                 I need two
>>>>>>>>>                                         volunteers (at least one
>>>>>>>>>                 "R"eviewer).
>>>>>>>>>
>>>>>>>>>                 Dan, since you
>>>>>>>>>                                         already reviewed previous
>>>>>>>>>                 version, could you
>>>>>>>>>                                         have a look?
>>>>>>>>>
>>>>>>>>>                 Thanks
>>>>>>>>>                 Yumin
>>>>>>>>>
>>>>>>>>>                 On 3/20/2015 3:20
>>>>>>>>>                                         PM, Yumin Qi wrote:
>>>>>>>>>
>>>>>>>>>                     Thomas,
>>>>>>>>>
>>>>>>>>>                      Thanks. Yes,
>>>>>>>>>                                         it is webrev04. Also, I
>>>>>>>>>                     have updated
>>>>>>>>>                                         webrev04 to add another
>>>>>>>>>                     test case change:
>>>>>>>>> test/runtime/memory/ReadFromNoaccessArea.java
>>>>>>>>>                      (Thanks Dan's
>>>>>>>>>                                         update)
>>>>>>>>>
>>>>>>>>>                     Thanks
>>>>>>>>>                     Yumin
>>>>>>>>>
>>>>>>>>>                     On 3/20/2015
>>>>>>>>>                                         11:55 AM, Thomas Stüfe 
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>                         Hi Yumin,
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the hotspot-runtime-dev mailing list