How do I attach source code in VisualStudio 2013? - c#

What is the best/correct way of attaching an external project source code so I can debug it?
I´ve already downloaded the source code of it from CodePlex, so I have all the .cs classes.
I´ve managed to import from a pdb file, but unfortunately, there´s no such file in this project codeplex (SimpleInjector).
After importing the SimpleInjector solution on VS, I could build it and generate the .pdb files, but I wonder whether it is the right way.

If your goal is to step-through debug the binary, then you will need the PDB files. In general, the compiled assembly just doesn't contain the information needed to associate source-code lines with individual IL commands.
The PDB file is a "program database file" which contains lots of useful debugging information; one of those things is the mappings between each compiled IL instruction and the source-code line that generate it. It also keeps a symbol table that lists the names of things that otherwise get compiled out (like local variable names, etc.) The PDB embeds the full path name of each source file, so if your source code is in the same place when you debug as it was when you compiled, the debugger will automatically find it.
If the .pdb file is present but the source code has moved, VS will give you the option to browse to the .cs file. But, if the .pdb file isn't present at all, your options will be rather limited.
The only risk you have is that you are debugging a program that doesn't match your PDB files. Therefore, if you are doing to try to debug the project, you should rebuild, from scratch, in Visual Studio and run that version of the binary.
(Debugging without symbols and source loaded into Studio is, of course, possible, but it's a much harder skill to master.)

Related

How to know where the pdb files is looking for source code

I have an external dll and a pdb file from C# code. I have the source code downloaded on my computer. In Visual Studio, under modules, Symbol status is: Symbol loaded for that specific dll. But User code is: N/A.
And I can't step into the functions in that dll. How do I know where to put the source code so the pdb finds it? Is the pdb looking the C# source file in a specific directory and is there a way to find out where?
There is a tool called SrcTool.exe that is installed with the WinSDK. Srctool.exe utility lists all files indexed within the .pdb file.
SrcTool.exe -r filename.pdb will print the source file paths.

VS 2010 Debugging

Is the .pdb file enough to debug and step into the code of a dll? Or do you actually have to reference the corresponding project source code?
I tried referencing a dll with the .pdb file in the same directory, and was unable to step into the code of the dll. So I was wondering what the rules around dlls and .pdb files where.
Thanks in advance.
The .pdb file will allow you to debug, but it will not provide any sources. Check out this blog post for an excellent description of PDB files and their purpose.
http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx
The PDB file is how visual studio knows how the executing code in the assembly corresponds to the lines in the source code. The answer to your question is yes, Visual studio needs the source code that the corresponding pdb was built from.
The pdb does not contain the source code packaged inside of it (well it can, but it is a bit of a hack and not many people do it), however the symbol server should automatically download it if it has the source available. However the pdb must match the exact version as the dll you are working with for it to download the source.
I have a small suspicion that you are trying to do the .NET framework source stepping and it is not stepping in to it. Microsoft has not updated the symbol servers with the current versions of the pdb files so source stepping is broken if you are running a up to date version of .net (at least until they release the new versions of the source files).

What is a PDB file?

What is a PDB file and how can I exclude it from the release folder when I rebuild my solution?
A PDB file contains information for the debugger to work with. There's less information in a Release build than in a Debug build anyway. But if you want it to not be generated at all, go to your project's Build properties, select the Release configuration, click on "Advanced..." and under "Debug Info" pick "None".
I had originally asked myself the question "Do I need a PDB file deployed to my customer's machine?", and after reading this post, decided to exclude the file.
Everything worked fine, until today, when I was trying to figure out why a message box containing an Exception.StackTrace was missing the file and line number information - necessary for troubleshooting the exception. I re-read this post and found the key nugget of information: that although the PDB is not necessary for the app to run, it is necessary for the file and line numbers to be present in the StackTrace string. I included the PDB file in the executable folder and now all is fine.
PDB is an abbreviation for Program-Debug Data Base. As the name suggests, it is a repository (persistent storage such as databases) to maintain information required to run your program in debug mode. It contains several vital information required for code debugging e.g. at what points you have put break points where you expect the debugger to break in Visual Studio (VS).
This is the reason why Visual Studio fails to hit the break points if you remove PDB files from the debug directory. Visual Studio debugger is capable of telling you the exact line number of code file at which any exception occurred along with its stacktrace. It is able to do so with the help of PDB files only. Thus PDB files are very helpful for debugging purposes.
In general, it is not recommended to exclude the generation of PDB files during build process. From production release stand-point, what you should be doing is create the PDB files but don't ship them to customer site in product installer. Preserve all the generated PDB files on a symbol server from where it can be used/referenced in future if required.
It is specially important in scenario where you debug process crash issues. While analysing the crash dump files, Visual Studio will not be able to make out the exact line of code where program is crashing if the original PDB files created during the build process were not preserved.
If you still want to disable generation of PDB files then follow below steps:
Go to properties window of the project. To open properties window, select the project file in solution explorer and press Alt + Enter.
Go to Build tab
Click Advanced
Choose none from Debug Info drop-down box
Press OK as shown in the snapshot below:
Note: This setting will have to be done separately for Debug and Release build configurations.
A PDB file contains information used by the debugger. It is not required to run your application and it does not need to be included in your released version.
You can disable pdb files from being created in Visual Studio. If you are building from the command line or a script then omit the /Debug switch.
Program Debug Database file (pdb) is a file format by Microsoft for storing debugging information.
When you build a project using Visual Studio or command prompt the compiler creates these symbol files.
Check Microsoft Docs

PDB files with .EXE or .DLL extension

I have a .net 4.0 web project which is running in debug mode. This was running perfectly until recently. Now it errors saying it can't fine various PDB files. The PDB files it is looking for are all present. However looking at the trace .NET is trying to find them with either a .pdb.exe or .pdb.dll extension.
Why is it looking for the extra part of the extension rather than just .pdb?
No application, web or otherwise will ever complain about finding PDB files.
I suspect you accidentally changed your assembly names instead of the debug output filename.

show definition (browse) in *.pdb of *.dll file

I have built a Library project (DLL) in .NET. And sometimes I use the DLL along with its PDB file as a reference in some other projects.
Now in the new project, I cant browse through the code of the DLL to debug. I can only see the definitions of class/methods/variables. That's by using "show definition" by browsing through the "class view"
However, only in case of an exception I the contents of the DLL opens and I could see the entire code of the DLL from the new project.
How could I see the contents (code) of the DLL before an exception occur?
If you just need to browse the code, load the dll up in Reflector -- you don't even need the PDB file: http://www.red-gate.com/products/reflector/
If an app loads the DLL while running under the Visual Studio debugger, it should load the symbols automatically. If all you have is a DLL, you may need to write a "driver" app that does nothing but load and exercise the DLL entry points.
If you want to debug your application programmaticaly, take a look at Mdbg (managed dbg).
You can also take a look at pdb2xml source, which give you good example of ISymbolReader interface, and how to use it to read pdb files.
Use JustDecompile, it's free.

Categories

Resources