调试 .NET Framework 源代码、.DotNetCore源码

条件

  • 加载符号文件:调试之前要加载符号文件,F11步入才有可能触发源码加载或下载
  • 加载源码(不会自动加载源码的情况):加载符号文件之后,调试器会根据符号文件记录的源码位置查找并打开源码。我们要做的就是触发加载源码的弹窗,手动选择上面下载的源码。

提前断点

  • 选择源码文件之后,即可开始调试。此时打开的源码可以在里面其它地方断点,运行到的时候就会命中断点,但前提是要加载它对应的符号文件
  • 如果需要在运行前断点,并在运行到断点行时命中,需要先加载符号文件:在调试-调试堆栈窗口选择需要断点的模块,单击右键选择始终加载,那么下次运行就会自动加载符号了。也可以在调试堆栈转到模块列表,然后设置加载。或者在工具-调试-符号-始终加载指定模块,填写dll名包括dll

调试DotNetCore

  • DotNetCore是开源的,源码位于github,所有通过Nuget分发的包都会附带构建时的源码,源码版本跟运行的dll版本一一对应,就不会像调试DotNetFramework源码一样差异过大
  • 在运行程序时自动从github下载病并加载加载pdb符号文件。如果加载全部符号启动将变得异常缓慢,所以仅选择需要调试的dll即可

加载符号

  • 首先找到需要调试代码所在的dll名称,在需要调试的方法上点击鼠标右键-转到定义。

  • 此时可能会从服务器上下载源码,需要等一会。下载完之后自动切换标签页,接下来要做的有两步,断个点,然后复制一下类名或者命名空间到.Net API浏览器搜索。

  • 点击搜索结果,跳转到类详情页,复制dll全称。

  • 在VS依次操作:工具-选项-调试-符号-指定包含的模块-右上角加号-粘贴-确定。

  • 完成符号准备工作,程序运行时将自动从符号服务器下载pdb符号文件并加载进程序。
  • 注意:如果是发布的第三方包,请把pdb删掉,不要一起发布,因为该pdb文件包含的源码地址时打包者电脑地址,其他人加载了改文件将找不到源码。而通过dotnet pack --include-symbols命令打包生成的pdb不好含本地源码地址。这样就不限于打包者本人直接调试通过nuget发布的dll,其他人也将可以通过本文所述方式进行调试,无需自己拉去源码编译dll。相关参考链接

调试

  • 一切顺利的话,运行程序,加载完符号,断点是红色实心,否则就要检查符号是否正常加载。接下来开始愉快的调试之旅

运行时加载符号调试

  • 此方法两个框架都适合,在调试自己的代码时,通过调用堆栈切换,触发加载符号的对话框,加载符号即可进行调试,但是下次还要调试时的话要重复此操作

打开调用堆栈

  • 首先在调试时打开调用堆栈。


调试中加载符号

  • 未加载符号的堆栈时灰色,双击它,自动出现加载符号页点击加载,将自动加载符号并跳转到源码页,在需要调试的地方断点即可开始调试
  • 类似的,调试DotNetFramework源码,可加载本地下载好的符号文件。调试时如果找不到源码文件会自动弹出选择源码的对话框,这时候再选择下载好的源码也可开始调试

注意

  • 下载的DotNetFramework源码可能跟引用的版本不是完全对应,这是需要注意的

调试 .NET Framework 源代码、.DotNetCore源码的更多相关文章

  1. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  2. 如何:调试 .NET Framework 源代码

    文章标题:如何:调试 .NET Framework 源代码 文章地址:https://technet.microsoft.com/zh-cn/cc667410.aspx

  3. 使用MiniProfiler给Asp.net MVC和Entity Framework号脉(附源码)

    在学习python开发框架pylons/pyramid的过程中,里面有个非常棒的页面性能监控功能,这样在开发过程中,你能清楚的知道当前页面的性能以及其它参数. 这里介绍一下如何给Asp.net MVC ...

  4. 年终福利:调试.NET Framework源代码

    前言 要问JAVA语言最大的优势之一,那就是开源.开源的JAVA框架让JAVA程序员可以不断的通过看源代码来学习.成长.解决问题.并随着时间增长能力越来越强,自然薪水就越来越高.而DONET程序员要看 ...

  5. 调试postgresql9.5.2最新源码

    最近在考量数据库的选型,考虑后期把数据切换到postgresql ,postgresql源码用c实现,代码很精炼完美,值得学习下 首先去pgsql官网下载最新的源码 ,然后还需要perl,bison ...

  6. 看懂Qt源代码-Qt源码的对象数据存储

    第一次看Qt源代码的人都会被其代码所迷惑,经常会看到代码中的d_ptr成员.d_func(函数)和Q_DECLARE_PRIVATE等奇怪的宏,总是让人一头雾水,下面这篇文章转自http://www. ...

  7. eclipse调试第三方jar包需要源码的问题

    很多时候测试自己的jar包功能时,需要有一个测试工程导入该jar包,但是一般在调试的时候,需要跟进去看看步骤和逻辑是否正确,这个时候就需要在jar包的源码中下断点.最近刚好自己也会经常这样做,也遇到了 ...

  8. [Android FrameWork 6.0源码学习] LayoutInflater 类分析

    LayoutInflater是用来解析XML布局文件,然后生成对象的ViewTree的工具类.是这个工具类的存在,才能让我们写起Layout来那么省劲. 我们接下来进去刨析,看看里边的奥秘 //调用i ...

  9. [Android FrameWork 6.0源码学习] View的重绘过程之Draw

    View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客里找一下 下面进入正题,开始分析调用以及函数原理 private void pe ...

随机推荐

  1. swift textfiled 输入完毕 return 隐藏键盘 方法

    学习swift 真是件头疼的事情 会的人少,又没有OC基础,所以 且学切珍惜吧. 在做登录的时候发现textfiled 自动调用键盘后不能隐藏?头疼 ~~~~询问了好多人 终于有人自写解答 为了方便后 ...

  2. MVVM模式理解

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  3. Ubuntu下Tomcat绑定80端口(zz)

    Ubuntu下Tomcat绑定80端口 来源:本站转载 作者:佚名 时间:2011-02-22 TAG: 工作环境迁移到了Ubuntu,很多东西发生了变化,比如原先配置tomcat端口.只需要配置se ...

  4. UDDI

    什么是 UDDI? UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成. UDDI 指的是通用描述.发现与集成服务 UDDI 是一种用于存储有 ...

  5. canvas 实现贪吃蛇游戏

    var canvas = document.getElementById('canvas'); var cxt = canvas.getContext('2d'); // 定时器 var timer; ...

  6. 2019.01.21 NOIP训练 可持久化序列【模板】(可持久化treap)

    传送门 题意简述:支持在把某个数插入到某版本的第k个位置,删除某版本第k个数,询问第k个数. 思路:用可持久化treaptreaptreap维护区间第kkk个位置的数是啥就可以了. 代码

  7. 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)

    传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...

  8. 2018.10.26 NOIP模拟 瓶子 (dp/贪心)

    传送门 正解是dp并不想去想了. 自己yy了一个贪心拿了95pts95pts95pts,唯一没过的点还只有一个地方错了,面向数据变成之后过啦! 所以我讲讲如何贪心. 考虑到最后都只会合并成一种颜色,所 ...

  9. scrapy知识积累

    Scrapy 中文文档https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html 创建项目 scrapy startproje ...

  10. c语言spline

    #define NRANSI #include "nrutil.h" void spline(float x[], float y[], int n, float yp1, flo ...