RFR(m): 8185712: [windows] Improve native symbol decoder
zgu at redhat.com
Tue Sep 5 14:22:39 UTC 2017
Looks good overall.
Is there reason to use ::malloc()/::free() instead of
buf might not be null-terminated if filename is longer than buffer len.
On 09/05/2017 09:05 AM, Thomas Stüfe wrote:
> Hi Goetz,
> thank you for your review!
> New Webrev:
> Delta to last:
> The only change is that I removed the -XX:InitializeDbgHelpEarly switch to
> avoid having to file a CSR.
> Please find further comments inline:
> On Mon, Sep 4, 2017 at 5:08 PM, Lindenmaier, Goetz <
> goetz.lindenmaier at sap.com> wrote:
>> Hi Thomas,
>> I had a look at your change. Great somebody finally fixes
>> the windows symbol printing, thanks a lot!
>> The code looks good, I'm just not sure whether you
>> need new files symbolengine.c|hpp. Isn't that
>> just what should go to decoder_windows.h|cpp and
>> class Decoder?
>> You would also get rid of the redirections in decoder_windows.cpp.
> As we discussed, I see your point, but would prefer to leave the change for
> the moment as it is.
> A similar change to this one - doing away with the AbstractDecoder object
> instantiation layer - will be coming for AIX, where it does not make much
> sense either, and I propose to do a separate cleanup or simplification
> change once that is done, merging decoder_windows.cpp and
> symbolengine.cpp/hpp. Unless I hear more objections from other reviewers,
> I'd prefer to do this in a later patch.
>> In shutdown() you comment
>> // There is no reason ever to shut down the decoder.
>> ... I think you can remove that function altogether, i.e. also
>> from the shared code, I don't see where it is ever called.
> Totally agree...
>> Also, I think, you can just delete Decoder::can_decode_C_frame_in_vm()
>> from the code. The only place where it is used, in frame.cpp,
>> calls dll_address_to_duntion_name(). This returns useful information
>> also in the case of the NullDecoder, which now is the only one to
>> return false in that function.
> totally agree also here, but would also prefer both issues in a separate
> change. In fact, Ioi opened a bug for this a while ago:
> https://bugs.openjdk.java.net/browse/JDK-8144855 - and I would like to fix
> it under that bug. Reason is, in this change, I'd like to avoid changing
> shared sources as much as possible and keep this change windows only.
>> Globals_windows.hpp needs Copyright adaption, please.
>> This is not introduced by your change, but maybe
>> you can also fix the copyright in decoder.hpp, which
>> says " 1997, 2015, 2017" ... should only name two
>> years ...
> Not needed anymore: since I removed the -XX:InitializeDbgHelpEarly switch,
> globals_windows.hpp is reverted to its original state. Do you still want me
> to fix the date?
> Thanks for the review work!
>> Best regards,
>>> -----Original Message-----
>>> From: hotspot-runtime-dev [mailto:hotspot-runtime-dev-
>>> bounces at openjdk.java.net] On Behalf Of Thomas Stüfe
>>> Sent: Mittwoch, 30. August 2017 14:34
>>> To: hotspot-runtime-dev at openjdk.java.net
>>> Subject: RFR(m): 8185712: [windows] Improve native symbol decoder
>>> Hi all,
>>> May I please have reviews for the following change.
>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8185712
>>> (This is the followup to: https://bugs.openjdk.java.net/
>>> Basically, this is a reimplementation of the layer around the Windows
>>> Symbol API (the API used to resolve debug symbols). The old
>>> had a number of errors and shortcomings which together caused the
>>> native symbol resolution (and hence callstacks in error logs) to be a bit
>>> of a lottery. The aim of this reimplementation is to make the code more
>>> robust and easier to maintain.
>>> The problems with the existing implementation are listed in detail in the
>>> bug description.
>>> The new implementation:
>>> - uses the new centralized WindowsDbgHelper class, which wraps the
>>> dbghelp.dll loading, introduced with JDK-8186349
>>> - Completely bypasses the "create two instances of AbstractDecoder class
>>> and synchronize access to them" scheme in decoder.cpp. It does not make
>>> sense for windows, where we have to synchronize each access to the
>>> dbghelp.dll anyway - this is done one layer below in WindowsDbgHelper.
>>> static methods of the shared Decoder class now directly access the static
>>> methods in the new SymbolEngine class, see decoder_windows.cpp.
>>> - The layer wrapping the Symbol API lives in the new symbolengine.cpp/hpp
>>> files. The coding takes care of properly initializing (once) the symbol
>>> and of assembling the pdb search path.
>>> - Pdb search path construction is changed: where before we just added jdk
>>> and jvm bin directories, we now just add all directories of all loaded
>>> (which, of course, include the jdk and jvm bin directories). That way we
>>> have a high chance of catching pdb files of third party libraries, as
>>> as they follow the convention of putting the pdb files beside the dlls.
>>> This means it is easier to analyse crashes where third party DLLs are
>>> - On Windows, we now have source file and line number in the callstack.
>>> - There is a new parameter, diagnostic and windows-only,
>>> called "InitializeDbgHelpEarly". That parameter is by default off. If on,
>>> it causes the symbol engine to be initialized early, which increases the
>>> chance of good callstacks later on (because the initialization does not
>>> have to run in an error situation).
>>> - Added tests: gtests and a jtreg test which tests the callstack
>>> All tests windows only. There is no technical reason for making them
>>> windows only, but I wanted to keep disturbances to other platforms to a
>>> minimum and these kind of tests can be shaky.
>>> Thanks a lot for reviewing this!
>>> Kind Regards, Thomas
More information about the hotspot-runtime-dev