C#调试含有源代码的动态链接库遇见there is no source code available for the current location提示时的解决方案

C#调试含有源代码的动态链接库遇见there is no source code available for the current location提示时的解决方案:

1.首先试最常规的方法:Clean and then rebuild solution,但是没有解决

2.进入Tools>Options,选择Debugging>General 却掉 Enable address-level debugging 选项,在去掉 Require source files to exactly match the original version.

Okay,解决问题。

最近在维护一个项目的时候有这样一个问题,项目Solution A引用了第三方的DLL文件,而我现在需要使用DLL类库的一些工具类,但是又没有相关的文档,所以我就需要Debug到DLL中进行调试查看代码的逻辑。开始的时候我想通过.NET Reflector反射出源代码,但是因为一些原因此方法行不通。现在我找到了遗留下来的DLL的源码,但是在另外的一个solution B中,所以现在我想要调试这些源码,要做的就是把源码映射到我们这个项目的DLL中。在介绍方法之前,先简单的说几个概念。PDB文件,DLL文件,源代码CS文件。当我们想调试一个DLL文件的时候,这三者是一个都不能少的。

DLL文件

就是程序在执行的时候,要使用的文件。注意,程序在运行的时候使用的是DLL这种二进制文件,而不是我们自己写的代码,是我们写的代码通过编译出来的DLL文件。

CS源代码

这就是编写的代码,用来生成DLL文件。程序在运行的时候,是根本不需要CS文件的。

PDB文件

当你编译一个project的时候,在bin目录下,伴随着DLL文件,你都会看到一个PDB文件,这个文件是做什么的呢。PDB是Program Database的简称,也成为Symbol File.PDB中存储的信息用来映射.cs文件中的源代码与编译后的DLL文件的对应关系。Debugger,即调试器,会使用这些信息来解析出两方面的信息:在Visual Studio中的呈现出来的源代码中的行号和这一行在DLL中的地址,即当在Visual Studio中的源代码中的某一行设置一个断点后,因为调试时运行的是DLL文件,Debugger需要知道中断在DLL中的某个地方,而PDB中正是记录着行号与这个地址的对应关系。PDB中解析出来的另一个信息是,这个DLL的源代码在哪里。当然如果是自己写的代码,源代码就在project下。但是如果我们引用了第三方的框架,比如说ASP.NET Framework,这时候我们本地根本就没有源代码,这时候PDB中记录了远端server上的代码地址。一句话概括,PDB文件充当了一个DLL与CS源代码之间的桥梁。

现在我们设定一种需求,比如说,我现在想在我的MVC Project中调试ASP.NET MVC Framework中诸如MVCHandler的Process Request方法,现在我们没有源代码,我们没有办法设置断点,即使使用F11 Step By Step调试,到了这种没有源码的代码行的时候,也是会直接跳过的,因为根本就没有地方可去啊。在调试的时候有一种My Code的概念,只有My Code的DLL才可以调试。其实,说白了,My Code的DLL就是有PDB的DLL。我们要调试MVC的DLL,首先就要获取System.web.mvc对应的PDB文件。在Project的调试状态下,点击Debug-->Windows-->Module,会发现System.web.mvc dll是 Cannot find or open the PDB file状态。微软有专门的服务器来提供框架的代码,所以我们可以从服务器上获取pdb文件。然后在Module中右击System.web.mvc一行,选中load pdb from server,会发现PDB会从server中load到本地。如果此时调试MVC代码,会有下图一样的提示。

因为此时Debugger认为你有PDB文件,是My Code,尝试着去调试,但是没有源代码,所以会提示你映射源代码。我们现在需要设置Tools-->Options-->Debugging-->Genral-->Enable Source Server为选中状态,这样,当调试System.web.mvc的时候,会自动从服务器下载源代码到本地。这时候,就可以调试诸如MVCHandler等ASP.NET MVC Framework中的类了。

回到我们最开始的需求,我们现在的情况是,我们的第三方DLL没有可以下载PDB文件的服务器。所以,我们要把源代码solution B中的DLL在build的时候,生成的PDB文件,拷贝到Soution A中,并且在Debug模式下,Moudule中指定第三方DLL的对应PDB的地址。这时候,在调试的时候,Debugger发现这个DLL中没有标记源代码服务器地址,会向上文说到的一样,会提示问你源代码在哪里,这时候你把路径映射到你本地的源代码就可以了。

注意:在第一种情况下,获取System.web.mvc的pdb文件的时候,是Visual Studio根据DLL中的相关信息,向微软的特定的server发出针对于某个pdb文件的请求,并下载的本地。这个过程是很精确的,下载的版本都是一致的,因为dll中都有相关信息记录的。而在第二种情况下,没有sever可供下载,需要人为导入。这个过程需要非常准确,就是说,你solution A中引用的DLL,必须跟你自己导入的PDB完全一致,完全对应,必须是产生DLL的同时产生的PDB.VS编译器有这样一种机制,在编译C#代码并产生PDB的时候,会有一种算法来优化PDB,好像还涉及到时间戳什么的,就是说,即使先后代码完全一致没有变动,在先后两次编译产生的PDB也是不一样的,如果在调试的时候导入的不一致,是不会映射成功的。

引文链接:

there is no source code available for the current location 解决方案

把第三方DLL的源代码引入到项目中

时间: 2024-11-03 21:33:58

C#调试含有源代码的动态链接库遇见there is no source code available for the current location提示时的解决方案的相关文章

在 NetBeans IDE 中调试 PHP 源代码

目录 准备工作 如何在 NetBeans IDE 中使用 XDebug 进行 PHP 调试 调试选项 使用工具栏和编辑器 调试器窗口 调试会话 样例调试会话 使用其他监视 PHP 和 HTML 混合用例 路径映射.调试器代理以及在定制 URL 上启动调试会话 要学习本教程,您需要具备以下软件和资源. 软件或资源 要求的版本 NetBeans IDE PHP 下载包 PHP 引擎 版本 5 Web 服务器 推荐使用 Apache HTTP Server 2.2. PHP 调试器 XDebug 2.

在ASP.NET 5项目中使用和调试外部源代码包

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于在ASP.NET 5中,项目依赖都是通过"包"来引用,所以使用和调试外部代码(比如DNX运行时)成为可能. .NET开源带来的一个额外好处就是,让ASP.NET 5的函数库引用变得更加灵活,不仅可以引用来自Nuget的编译好的包,也可以引用本地源代码.本地源代码只要符合打包规则,即源代码根文件夹"src"包含项目子文件夹,项目目录包含project.

调试JDK源代码-一步一步看HashMap怎么Hash和扩容

调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码-Hashtable实现原理以及线程安全的原因 还是调试源代码最好. 开发环境  JDK1.8+NetBeans8.1 说明:调试HashMap的 public V put(K key, V value) 方法并查看key的值时不能显示变量的值,原因在于oracle提供的jre中rt.jar不带de

调试 Hadoop 源代码

环境是 64bit Ubuntu 14.04 系统, jdk 1.7 以及 Eclipse Mars (4.5) 这里介绍两种调试 Hadoop 源代码的方法: 利用 Eclipse 远程调试工具和打印调试日志. 这两种方法均可以调试伪分布式工作模式和完全分布式工作模式下的 Hadoop. (1) 利用 Eclipse 进行远程调试 下面以调试 ResourceManager 为例, 介绍利用 Eclipse 远程调试的基本方法, 这可分两步进行. 步骤 1  调试模式下启动 Hadoop. 在

调试Java源代码时变量的值无法追踪怎么办?

问题:调试Java源代码时,只能看到源代码,却无法查看源代码中的变量的即时值 原因:jre为了节省空间,在打包时去掉了class文件中的调试信息. 思路:使用jdk里的src.zip源码重新编译生成完整的带有调试信息的class文件 做法: 1.新建一个Java Project 2.解压缩src.zip,把里面的java和javax两个文件夹复制粘贴到工程里作为source 3.在Eclipse中,打开window/preferences/java/compiler/errors or warn

调试 ms 源代码

如果需要调试 WPF 源代码或框架源代码,那么需要使用 DotPeek 首先需要下载 dotPeek ,可以到官网下载 dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains 还可以到 csdn 下载 首先打开 dotPeek 然后点击启动符号服务器,所有符号. 然后点击工具设置,可以看到这个页面 然后打开 VS 工具选项,在调试设置符号,刚才已经复制了,现在添加就好 然后还需要去掉微软的服务和本地缓存 然后写一个呆磨进行测试

【开源】海看源代码统计工具 Haikan Source Code Counter

Haikan Source Code Counter 海看源代码统计工具 BY 杭州海看网络科技有限公司 ------------------- github上的地址: https://github.com/haikanwhf/HaikanSourceCodeCounter ------------------ 海看源代码统计工具V1.7.rar

调试location指令时,直接让location输出文本

有时候我们调试location指令时希望location指令能够直接输出文本,这样能够方便我们进行调试.这时我们可以使用echo模块实现,但是大多数情况我们没有安装这个模块,那么我们还可以使用另一个方法来实现这个想法 直接返回文本 location / { default-type text/plain; return 502 "this is a test message"; } html标签格式 location / { default-type text/html; return

win7下vs2010编译调试stl源代码

平台环境:windows 7 32位+VS2010+STL源代码5.2.1 STL在sourceforge下载,如果不可以下载,可以在csdn下载. 下载好源码后,首先解压到硬盘,我解压到D:\STL. 在vs2010 tools选择“Visual Studio 命令提示(VS2010)” 在cmd窗口,目录切换到刚刚解压源码的根目录, 输入configure -help查看编译选项 显示平台式XP,这里暂时不管. 输入configure msvc9配置环境 上面红框里面的内容不用去管. 之后切