“浏览寻找来源”在Visual Studio 2010中 [英] "Browse To Find Source" in Visual Studio 2010

查看:183
本文介绍了“浏览寻找来源”在Visual Studio 2010中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

何时在Visual Studio 2010中启用浏览查找源? (见下文)





此外,我想启用它,以便我可以浏览已经下载的源代码
文件从框架本身和Microsoft的源代码,通常会发生这种情况没有为源代码提供可用的PDB文件,而是Microsoft已经放置了一些不能用于逐步调试的PDB文件。这比您想象的更频繁,因为Microsoft通常会对.NET Framework源代码进行更新(修补程序)。这些更新通过 Windows Update 静默安装到您的计算机上,您很惊讶,看到昨天你可以调试.NET Framework源代码,今天你不能。通常需要一些时间,直到他们为最新的代码放置一个有效的PDB文件。在这种情况下,您可以使用 .NET Reflector Pro逐步调试功能或虚拟机一个具有可用PDB文件的.NET框架版本,并禁用该机器上的Windows Update。

When is "Browse To Find source" enabled in Visual Studio 2010? (see below)

In addition, I want to have it enabled so that I could browse to already-downloaded source code files from http://referencesource.microsoft.com/.

This would be useful since Microsoft doesn't always release PDB/source code at the same time with their latest patches. So if I want to step for example into DateTime, I really don't care about the latest patches which didn't involve DateTime. I just want to browse to its code which I downloaded from http://referencesource.microsoft.com/.

After some investigations I found dia2dump which is a useful tool to view PDB file contents. (It's in C:\Program Files (x86)\Microsoft Visual Studio 10.0\DIA SDK\Samples\DIA2Dump\)

It looks like when I can't see source code for something like DateTime, using .NET Framework stepping, a mscorlib.pdb file actually gets downloaded.

But if you look inside it with dia2dump it doesn't contain source file mappings. In other words useless, because even if you could browse to the source code like my initial idea, it wouldn't work because there are no source file mappings and no start addresses of the functions, and a lot of stuff missing :(

I think the solutions here are to use .NET Reflector Pro for or keep a virtual machine at hand, with releases of the framework which have source code and then disable updates.

解决方案

Introduction

Whenever you do a build from Visual Studio, normally, you also get a PDB file besides your executable file. You can see this file in the ..bin\Debug or ..bin\Release directory. This PDB file keeps a mapping to your source code lines and executable code in your assembly. Also, the original locations of the source code files from which a build was done is stored inside a PDB file. This means that if you build a class library which had a single file located at G:\ClassLibrary\Class1.cs, this path will be stored inside ClassLibrary.pdb. What is important to remember from all this is that without a PDB file it is impossible to do source code step-in debugging.

Real-life scenario

So, suppose I do a build on my drive G:\ClassLibrary1, for a class library.

I give you a ClassLibrary.dll and a ClassLibrary.pdb file, or you get them by checking them out from source control.

You reference the ClassLibrary.dll in your project and you use a class from the library.

If you now try to step into class code from the library the following will happen:

Visual Studio tries to locate a ClassLibrary.pdb file in a couple of locations

  • 1.1 If it doesn't find it, you get a "Browse to find source" disabled page. Remember, you can't debug without a valid PDB file.

  • 1.2 If it does find a PDB file, it looks inside the PDB file and sees that you are trying to debug Class1.cs which was originally built from

    G:\ClassLibrary1\Class1.cs
    

    and looks on your computer for that file.

  • 1.2.1 If it finds it, it steps into the code automatically.

  • 1.2.2 If it doesn't find it, you get the following dialog:

If you press Cancel, you will be presented with the: "No source available" and you will have "Browse to find source" enabled in this case.

Why? Because you have a valid PDB file, but Visual Studio can't possibly know where you have the source code for ClassLibrary1 on your computer or if you even have it on your computer. That's why you got the dialog -> so that you can point Visual Studio to the exact location of the source code file.

Final notes

So what will you do when you get a browse to find source disabled?

In Visual Studio, you open menu Debug -> Windows -> Call stack.

You right click on the top call stak instruction and you choose "Symbol Load Information". It will show you the locations where Visual Studio has tried to find a valid PDB file.

  • 1.a If you only see "Cannot find or open PDB file" messages put a valid PDB file at any of these locations. (You might have to scroll right to see the messages) Stop and start debugging again.
  • 1.b If you see a "PDB does not match the image" message it means the following. Visual Studio has found a PDB file, but it is for another build. If I build ClassLibrary1.dll and give it to you, and then I build it again without changing a single line of code and then give you the PDB, and you try to debug classLibrary1.dll you will get this message. The assembly and its PDB file must be exactly from the same build, otherwise you will get this message. (This check is done using some unique number put inside the assembly and PDB file every time you do a built)
  • 1.c You see a "symbols loaded" message but still get a "Browse to find" disabled. It means that the PDB file you have is not good for step-in debugging. Some PDB files you try to use don't have all the information in them necessary for step-in debugging. I think you can control this from somewhere in the advanced build settings, but I haven't tried it though, because I want to have usable PDB files generated everytime I do a build. This situation often happens if you try to debug the source code of the .NET framework itself and Microsoft hasn't put usable PDB files for the source code, but instead Microsoft has put some PDB files which can't be used for step-in debug. This happens more often than you think, because often Microsoft makes updates (patches) to the .NET Framework source code. These updates silently install onto your computer via Windows Update, and you are surprised to see that yesterday you could debug .NET Framework source code and today you can't. It usually takes some time until they put a valid PDB file for the latest code. In this case you can use .NET Reflector Pro step-debug ability or a virtual machine which has a .NET framework version with usable PDB files and disable Windows Update on that machine.

这篇关于“浏览寻找来源”在Visual Studio 2010中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆