RFR: 8146009: "pure virtual method called" with using new GC logging mechanism

Marcus Larsson marcus.larsson at oracle.com
Tue Oct 11 10:12:01 UTC 2016


Hi,


On 10/11/2016 11:53 AM, Thomas Stüfe wrote:
> Hi Marcus,
>
> On Tue, Oct 11, 2016 at 11:41 AM, Marcus Larsson 
> <marcus.larsson at oracle.com <mailto:marcus.larsson at oracle.com>> wrote:
>
>     Hi Thomas,
>
>
>     On 10/11/2016 11:13 AM, Thomas Stüfe wrote:
>>     Hi Markus,
>>
>>     just a question whether I understand this correctly: Logging
>>     works already from static initialization on, but as no arguments
>>     are parsed yet, the default is to print out all warning and error
>>     level messages to stderr?
>>
>>     If true, this may be potentially confusing, because there will
>>     always be a small window at startup where logging does not behave
>>     as expected from the command line arguments given. Like, if I
>>     redirect log output to a file, the first burst of log output
>>     would still go to stderr. This may also confuse tools which grep
>>     the output of a VM.
>
>     Yes you're right, it's a limitation of UL at the moment. Logging
>     before argument parsing means you can only use warning and error
>     level, and can only expect to see it on stdout.
>
>>
>>     Additionally, during initialization one may actually want precise
>>     control of the logging system before arguments are parsed, e.g.
>>     in os::init(). We have a lot of tracing in the AIX os layer
>>     initialization which currently goes to nil because it runs before
>>     Xlog argument parsing is done.
>>
>>     Both situations could be solved if there were a possibility to
>>     specify logging options right from the start, e.g. via a file or
>>     an environment variable, which could be parsed in a static
>>     initializer without relying on any VM initialization.
>
>     It's either that or we implement some early logging buffering that
>     saves all logging happening before UL initialization and logs it
>     after UL is fully initialized. We haven't had the need for that
>     early logging previously, but given that you seem to require it,
>     it seems like a worthwhile enhancement of UL now.
>
>
> Thank you! This would be helpful.
>
> I think that buffering is not a good solution. For one, it requires 
> you execute each and every log call and buffer the resulting string, 
> because you do not know yet which of the log calls will be active. 
> This may be cpu and memory intensive, which especially at startup may 
> hurt.

That's a fair point. Although I don't think we should have enough such 
logging (before UL init) to make a significant difference. At least I 
hope not. Some of it could perhaps be debug-only logging (log_develop... 
etc)?

>
> Also, there is no guarantee the VM even lives long enough to parse the 
> Xlog arguments to print out the buffered messages. The situations 
> where we use early logging are often situations where the VM crashes 
> early.

Unprocessed log buffers could possibly be printed in the hs_err output 
to avoid logging losses when the VM crashes early. Having an additional 
early parsing step seems more complicated to me (at least at first glance).

Thanks,
Marcus

>
> Kind Regards, Thomas
>
>     Thanks,
>     Marcus
>
>>
>>     Kind Regards, Thomas
>>
>>
>>
>>     On Mon, Oct 10, 2016 at 11:20 AM, Marcus Larsson
>>     <marcus.larsson at oracle.com <mailto:marcus.larsson at oracle.com>> wrote:
>>
>>         Updated webrev after feedback:
>>         http://cr.openjdk.java.net/~mlarsson/8146009/webrev.01
>>         <http://cr.openjdk.java.net/%7Emlarsson/8146009/webrev.01>
>>
>>         Incremental:
>>         http://cr.openjdk.java.net/~mlarsson/8146009/webrev.00-01
>>         <http://cr.openjdk.java.net/%7Emlarsson/8146009/webrev.00-01>
>>
>>
>>
>>         On 10/07/2016 04:26 PM, Marcus Larsson wrote:
>>
>>             Hi,
>>
>>             Making another attempt to fix this issue.
>>
>>             Summary:
>>             The following patch resolves a problem where the VM would
>>             crash during shutdown due to static log related memory
>>             being de-initialized before the last use of the logging
>>             framework. The solution involves parts of the Nifty
>>             Counter idiom [0] to control static initialization and
>>             de-initialization of stdout's and stderr's LogOutputs.
>>             Both objects are now allocated using placement new, and
>>             avoids destructor calls during de-initialization. The
>>             LogStreamInitializer makes sure both objects are
>>             initialized before first use.
>>
>>             Because the LogOutput::Stdout/err pointers could no
>>             longer be kept in LogOutput, I've replaced all usages of
>>             them with the new references instead.
>>
>>             The patch includes a regression test for this issue,
>>             contributed by Michail Chernov.
>>
>>             Webrev:
>>             http://cr.openjdk.java.net/~mlarsson/8146009/webrev.00
>>             <http://cr.openjdk.java.net/%7Emlarsson/8146009/webrev.00>
>>
>>             Issue:
>>             https://bugs.openjdk.java.net/browse/JDK-8146009
>>             <https://bugs.openjdk.java.net/browse/JDK-8146009>
>>
>>             Testing:
>>             JPRT testset hotspot, included test on supported platforms.
>>
>>             Thanks,
>>             Marcus
>>
>>             [0]
>>             https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter
>>             <https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter>
>>
>>
>>
>
>



More information about the hotspot-dev mailing list