Debug, Release Build
Like most of you know visual studio projects has some predefined build configurations: Debug and Release. Using Debug, the program is compiled with full symbolic debug information and no optimizations.With Release the program is compiled using Optimize code and pdb-only options. The pdb-only option does not generate the DebuggableAttribute that tells the JIT compiler that debug information is available, but generates a .pdb (program database) file to allow viewing information such as source filenames and line numbers in the application’s stacktrace.
Optimized code is harder to debug since the compiler repositions and reorganizes instructions to get a more efficient compiled code, so generated instructions may not correspond directly to the source code. Some optimizations are always performed by the compiler and others only performed when the Optimized code option is set; optimization may include things like: constant propagation, dead code elimination. .Net runs optimizations in 2 steps: one optimization run by the compiler when generating the IL code and other when running the application and transforming IL to machine code, most optimizations are left to the JIT compiler.
While reviewing more about it, it seems that optimization is separate from pdb generation so pdb-only generation shouldn’t affect performance in most scenarios and it is recommended to produce PDB files, even if you don't want to ship them with the executable.
In order to debug an application with visual studio, we require the matching pdb file: The debugger looks for the PDB files using the dll or executable name and looks for [applicationname].pdb. When .dll, executable, and PDB files are generated it creates and stores identical GUIDs in each file. The GUID is used to determine if a given PDB file matches a DLL or an executable file.
You can use DUMPBIN to see if pdb files are found for a given dll, for example:
e:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>dumpbin /pdbpath:verbose "e:\Projects\VS 2008\RemoteDebugging\WpfApplication1\bin\Release\WpfApplication1.exe" Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file e:\Projects\VS 2008\RemoteDebugging\WpfApplication1\bin\Release\WpfApplication1.exe File Type: EXECUTABLE IMAGE PDB file found at 'e:\Projects\VS 2008\RemoteDebugging\WpfApplication1\bin\Release\WpfApplication1.pdb' Summary 2000 .reloc 2000 .rsrc 2000 .text e:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>
e:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>dumpbin /headers "e:\Projects\VS 2008\RemoteDebugging\WpfApplication1\bin\Release\WpfApplication1.exe" ..... Dump of file e:\Projects\VS 2008\RemoteDebugging\WpfApplication1\bin\Release\WpfApplication1.exe ..... Debug Directories Time Type Size RVA Pointer -------- ------ -------- -------- -------- 4D97EE82 cv 6C 00003708 1908 Format: RSDS, {9873ECF8-BA29-4C84-9AF5-BC54B1E6FFD4}, 1, E:\Projects\VS 2008\RemoteDebugging\WpfApplication1\obj\Release\WpfApplication1.pdb
[.NET Framework Debugging Control] GenerateTrackingInfo=1 AllowOptimize=0
This tells JIT compiler to generate tracking information and not run optimizations, making it possible for the debugger to match up MSIL and not optimizing resulting machine code.
Remote debugging
To remote debug a .net application you can use the visual studio remote debugger (msvsmon.exe),Both machines should have access/permissions to connect to each other. Start visual studio remote debugger on the machine running the application, this will start visual studio remote debugging monitor displaying the following information.
Msvsmon started a new server named 'Domain\user@machinename'. Waiting for new connections. machine\user connected.
Nice article. Thanks for sharing. :)
ReplyDelete