We have made some changes with respect to /DEBUG:FASTLINK starting with Visual Studio 2015 Update 1 CTP. /DEBUG:FASTLINK is aimed at improving link times for the incremental developer loop inside Visual Studio and for medium to large size projects provides ~2x gains. The linker is currently involved in the PDB generation process and merging of type information, fixing up private symbol’s type indexes, and generating global symbols are major time components in PDB generation. With /DEBUG:FASTLINK the linker produced PDB doesn’t have any private symbol, and debug information is distributed among input object and library files and the linker generated PDB just serves as an indexing database. DIA APIs have been modified which allows the Visual Studio debugger to provide a seamless experience for debugging (only), and using this option provides much faster link times with little or no impact to overall debugging experience. This experience today will work great as long as you are developing inside Visual Studio. /DEBUG:FASTLINK today is the default Linker->Debugging property for Universal project templates (Debug Configuration only, Figure below).
When debugging using the linker PDB and PE on a different machine from where they originated or in other words when you share the PDB and PE with a fellow developer in the team you are likely to see the following error message.
This is due to the fact that the PDB generated by the linker with /DEBUG:FASTLINK is a partial PDB as mentioned above. Based upon the feedback we have received we are in the process of improving this error message. The new error message will provide more details such as which binary, which OBJ file, which OBJ inside which static LIB, or which compiler generated PDB file, is missing.
In order to be able to debug with this PDB sharing scenario in mind, the current way to fix this is to generate a full PDB before sharing using the ‘Generate Full Program Database File’ option in the Linker-> Debugging property page (figure below). When this option is set to ‘Yes’ on hitting build we will currently perform a minimal build which will relink and overwrite the partial PDB with the full PDB, in the future however instead of re-linking a new tool will be called which will collect and process debug records from all input OBJs, static LIBs and compiler generated PDBs, and then overwrite the partial PDB produced by the linker with /DEBUG:FASTLINK. This process will be substantially faster than relinking and the resulting PDB will contain all relevant debug info for the binary as if it was linked with /DEBUG. In addition to this we will be adding support to specify the paths the object files in a future update, but in the current release this is not supported.
Moving forward the plan is to enable /DEBUG:FASTLINK by default for all project templates in the future in hopes of faster link times, so we would love to hear from your feedback on this front before we go on and productize these changes.