Change the naming convention for debug symbol files on Windows to avoid collisions (e.g. java.exe/java.dll -> java.pdb)

Frederic Thevenet fthevene at redhat.com
Mon Oct 2 18:21:50 UTC 2023


Hi,

I would like to submit the following proposal for discussion on this 
list: changing the naming convention for debug symbol files on Windows, 
in order to avoid collisions.

When building OpenJDK on Windows using 
"--with-native-debug-info=external", the resulting debug symbols are 
saved in files located in the same folder as the corresponding 
executable or library and named by swapping the extension ".exe" or 
".dll" for a ".pdb" one (or "diz" if option 
"--with-native-debug-info=zipped" is used).

While this is indeed a common convention on Windows - and the default 
configuration in Visual Studio - this has the unfortunate side effect of 
producing colliding paths in the event of an exe and a dll file sharing 
the same target folder and file name, save for the extension.
In the case of OpenJDK, there are three occurrences (that I am aware of) 
where this happens:  "bin\java.exe" and "bin\java.dll" resolve to the 
same "bin\java.pdb" for their symbols, as do "jimage.exe/jimage.dll" and 
"jpackage.exe/jpackage.dll", meaning both set of debug information 
cannot naturally coexist while strictly adhering to the rule.
(NB: Builds for unix-like platforms are not affected by this, due to a/ 
the fact that libraries and launchers are not located in the same 
folder, b/ the radical for executables and libraries typically differ, 
e.g. java / libjava)

Since it is generally admitted that the debug symbols for the libraries 
contain are likely to be more useful that those for the launchers,  
specific build logic has to be added in several places to ensure those 
symbols are always prioritized [1][2].

This is nonetheless a sub-optimal situation, since:
   - it leaves out entirely the debug info for java.exe, jpackage.exe 
and jimage.exe
   - It requires special case handling in the build logic to guaranty 
consistency in what symbols are kept, which needs to be updated each 
time a new occurrence is introduced.
   - It is overall surprising to developers unaware of this situation 
and likely to raise suspicion of a bug[3].

One way to avoid all the issues above, would be to adopt a naming 
strategy for the pdb files that does not incur a risk of collision; for 
instance by keeping the original extension in the final name, e.g. 
"jvm.dll" -> "jvm.dll.pdb" instead of "jvm.pdb" (and 
"jvm.dll.stripped.pdb" for stripped symbols if 
"--with-external-symbols-in-bundles=public" is used, "jvm.dll.diz" for 
"--with-native-debug-info=zipped").

According to my initial findings, the changes to accomplish this are 
quite straight forward and easy to circumscribe to the Windows build [4].

Also, I have verified that the ".pdb" files with the new names are 
recognized by the Windows debugger in the same way as the old one; i.e. 
it requires no extra configuration steps to tell the debugger where to 
find the right symbol files [5].

I'm looking forward to your feedback on this proposal.

Thanks,

[1] 
https://github.com/openjdk/jdk/blob/a564d436c722f14041231158f21c4ad3a2f6a3a5/make/Images.gmk#L277
[2] 
https://github.com/openjdk/jdk/blob/a564d436c722f14041231158f21c4ad3a2f6a3a5/make/CreateJmods.gmk#L84
[3] https://bugs.openjdk.org/browse/JDK-8263356
[4] 
https://github.com/fthevenet/jdk/commit/877a3db829e4b3bba2bef05950e22de7ed89e3f8
[5] The naming used at the moment is the one commonly used on Windows 
but the name of pdb file can be whatever; it is in fact stored within 
the PE header of the artifact, which is how the debugger knows how to 
match them. See 
https://polystream.com/behind-the-curtain-understanding-the-magic-behind-loading-symbols-in-visual-studio/

-- 
Frederic Thevenet
Senior Software Engineer - OpenJDK
Red Hat France<https://www.redhat.com>
BAF5 C2D2 0BE0 1715 5EE1 0815 2065 AD47 B326 EB92



More information about the build-dev mailing list