code review round 0 for JDK-8028749 java -version crashes with 'fatal error: heap walk aborted with error 1'
Ron Durbin
ron.durbin at oracle.com
Fri May 2 20:42:10 UTC 2014
Ok, thanks Dan
I will get started making the changes.
Reviewers if you want to wait for the new version I should have
it out by Monday.
> -----Original Message-----
> From: Daniel D. Daugherty
> Sent: Friday, May 02, 2014 1:48 PM
> To: Ron Durbin
> Cc: hotspot-runtime-dev at openjdk.java.net
> Subject: Re: code review round 0 for JDK-8028749 java -version crashes with 'fatal error:
> heap walk aborted with error 1'
>
> On 5/2/14 12:08 PM, Ron Durbin wrote:
> > Greetings,
> >
> > This fix resolves:
> >
> > JDK-8028749 java -version crashes with
> > 'fatal error: heap walk aborted with error 1'
> >
> > Summary:
> > When the gflags are enabled it appears that Windows does not
> > support application heap checking. This fix disables part of the
> > JVM heap check based on the Windows HeapWalk() API when certain
> > gflags checks are enabled.
> >
> > Testing:
> > These code changes have tested by completing a successful HotSpot build
> > with windows heap checks turned on and off.
> > The heap check manipulation was done via gflages.exe
> > with a reboot following each change before each test run.
> >
> > The success criteria was a successfully completed build without
> > the java command crashing and leaving a mini dump.
> > This fix disables part of the JVM heap check based on the Windows
> > HeapWalk() API when certain gflags checks are enabled.
> >
> > You will find the webrev by following the URL below.
> >
> > http://cr.openjdk.java.net/~rdurbin/JDK-8028749-webrev/0-jdk9-hs-runtime/
>
> src/os/windows/vm/os_windows.cpp
> I think I see a flaw in the logic and you were right all along...
> Sorry I didn't see this when you did the whiteboard talk on Tues.
>
> Consider if this:
>
> line 5020: DWORD err = GetLastError();
>
> returns a value ERROR_FOO. In the old logic, we would always
> call fatal() on line 5020:
>
> line 5019: if (err != ERROR_NO_MORE_ITEMS && err !=
> ERROR_CALL_NOT_IMPLEMENTED) {
> line 5020: fatal(err_msg("heap walk aborted with error %d", err));
>
> In the new logic, we no longer call fatal() with a value of ERROR_FOO:
>
> line 5027: if (err != ERROR_NO_MORE_ITEMS &&
> line 5028: err != ERROR_CALL_NOT_IMPLEMENTED &&
> line 5029: (did_first_heapwalk_call && err ==
> ERROR_INVALID_FUNCTION)) {
> line 5030: fatal(err_msg("heap walk aborted with error %d", err));
>
> The logic phrases on lines 5027 and 5028 are both still true with
> a value of ERROR_FOO, but the logic phrase on line 5030 will never
> be true with a value of ERROR_FOO.
>
> On Tuesday, you said we should put the new check inside the existing
> if-statment and you were right. Jerry and I were both wrong. Sigh...
>
> So this should do it:
>
> line 5027: if (err != ERROR_NO_MORE_ITEMS && err !=
> ERROR_CALL_NOT_IMPLEMENTED) {
> line 5028: if (!did_first_heapwalk_call && err ==
> ERROR_INVALID_FUNCTION) {
> line 5029: // only ignore this error on first HeapWalk() call
> line 5030: } else {
> line 5031: fatal(err_msg("heap walk aborted with error %d", err));
> line 5032: }
> line 5033: }
>
> An ERROR_FOO value will always fail the logic phrase on line 5028
> so it will always call fatal on line 5031. ERROR_INVALID_FUNCTION
> only gets a pass on the first call to HeapWalk().
>
> It's ugly, but it's the only way I see to avoid duplicating the
> fatal() line.
>
> Dan
>
More information about the hotspot-runtime-dev
mailing list