Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to debug into .NET framework source code

Tags:

c#

.net

debugging

How can one debug the .NET framework source code using Visual Studio 2017?

There are some questions here on stackoverflow about this topic, but even after reading all of them, I still wasn't able to make it work. I thought it would be useful to present an up-to-date, working solution about how to debug .NET framework source code.

I would like to solve it without using any external tools (e.g. dotPeek as source server).

like image 922
Károly Ozsvárt Avatar asked Feb 19 '19 20:02

Károly Ozsvárt


People also ask

How do I Debug .NET core source code?

To debug . NET and ASP.NET Core source code in Visual Studio: In Tools -> Options -> Debugging -> General, un-check Enable Just My Code. Verify Enable Source Link support is checked.

How do I Debug a .NET application in Visual Studio?

As the following image shows, Visual Studio indicates the line on which the breakpoint is set by highlighting it and displaying a red dot in the left margin. Press F5 to run the program in Debug mode. Another way to start debugging is by choosing Debug > Start Debugging from the menu.

How do I enable breakpoint of source code?

To set a breakpoint in source code: Click in the far left margin next to a line of code. You can also select the line and press F9, select Debug > Toggle Breakpoint, or right-click and select Breakpoint > Insert breakpoint. The breakpoint appears as a red dot in the left margin.


2 Answers

First of all, I tested it using Microsoft Visual Studio Enterprise 2017, Version 15.9.7 and via .NET Framework 4.7.2. Though, I think it should work on Community edition the same way.

Steps to take:

  1. Go to Tools / Options / Debugging / General, and perform these settings:

    • check Enable .NET Framework source stepping (this will automatically disable "Enable Just My Code"; if not, do it manually)
    • uncheck Require source files to exactly match the original version
    • check Enable source server support
  2. Go to Tools / Options / Debugging / Symbols, and:

    • in the upper listbox check Microsoft Symbol Servers
    • click Empty Symbol Cache button (to make sure you will get the correct symbols)
    • select Load all modules, unless excluded radio button at the bottom
  3. Download the source of the .NET framework version your project is targeting, from the https://referencesource.microsoft.com/download.html site.

  4. Unpack the downloaded archive (zip) file to a convenient path on your PC.

  5. Debug your application; set a breakpoint to the line of .NET code you wish to debug, and step to the desired code line with the debugger.

Note: your application may start slower since it will download PDBs from the internet.

  1. Press Step Into (F11 by default). If your settings are correct, this will cause some delay (if your VS crashes (like mine did), Empty Symbol Cache again). Eventually it will ask for the sources of the given file, e.g. dictionary.cs. Two things can happen here:

    • A) It asks for the source file (.cs) in a file dialog. Go to step 7.
    • B) It says whatever.cs not found, and there is a link that says "Browse and find whatever.cs...". Click that link.
  2. Select the corresponding .cs file on your disk (you can search for the file on the OS).

Note: I had to restart VS several times until it "did not crash" while looking for sources, this is most likely a bug in VS.

  1. If you did everything correctly, you will find yourself debugging the .NET source code.

Note: Since VS saves the path you entered for the source files, you can stop debugging or restart VS; it will work next time, too. Besides, you do not have to manually select any more source files within the framework, because the VS will use the source folder you entered and will search in source files there.

like image 90
Károly Ozsvárt Avatar answered Sep 30 '22 05:09

Károly Ozsvárt


Many people wondering why they can't step into source although they does set the checkboxes as described above. I'm, too.

Because you can extract dotnet sources to any location, Visual Studio isn't able to know about them and the reason can't be the source files itself (why Visual Studio doesn't find the files).

But some dll's are browseable, some not (through double clicking in Visual Studios stack view or context menu > goto source). This brought me to the assumption, that the .pdb itself must be the reason. If you look into a file which works (e.g. notepad), you see at beginning a list of strings with file pathes (source files). In files, which doesn't work, the files starting immediatelly with binary data.

For some reason microsoft doesn't create her .pdb's with full debug information in every build process. But why not - good question! g

In short: you have to search a dll version of your file (which you like to debug) which contains FULL DEBUG INFORMATION. This is also the reason why context menu disables "goto source". I'm replacing this file temporary in global assembly cache for time of debug. This works for me.

Here an example of PresentationFramework.dll - 4.0.30319.298 => pdb size: 1219 KB - 4.0.30319.18408 => pdb size: 15.562 KB

Perhabs somebody can create a public database (wiki), which everyone can add files and versions for which full debug information are available?

like image 25
Michael Avatar answered Sep 30 '22 03:09

Michael