Debugging into .NET Core源代码的两种方式

一、前言

   .NET开源时间还不长,因为一直在做YOYOFx的关系,所似我常常有更深入的了解.NET Core和ASP.NET Core内容的需求,并且.NET Core平台与之前版本的变化太大,这也导致我经常要去查看源代码中,来了解ASP.NET Core和.NET Core代码实现。

  的确,.NET Core和ASP.NET Core的源代码,现在已经在Github上进行了代码托管;但不管是在Github上在线阅读或是将源代码Clone到本地阅读,都比较有局限性,我最想要的还是能通过调试的方法,单步的对程序进行DEBUG调试断点到源代码中。

  我写这篇文章的目地也是描述一下,如何调试.NET Core源代码的步骤,我总结了两种对.NET Core源代码的方法。

二、符号服务器

以前微软给我们调试.NET程序的方法,通常是在Visual Studio加入符号服务器,来调试.NET托管程序。我们这次使用同样的方法,来完成这个调试源代码的任务。

  首先.NET Core的符号服务器地址:https://dotnet.myget.org/F/dotnet-core/symbols/ ,关于这个符号服务器地址是怎么找到的,还是去MyGet上去多溜溜,发现肯定会不少。

  我们这次使用Visual Studio 2015 Update3,来完成以下操作:

  1.设置符号服务器

  在VS2015的Tools -> Options -> Debugging ->Symbols中,添加符号服务器地址:https://dotnet.myget.org/F/dotnet-core/symbols/ ,然后最好清一下符号文件的缓存。

2.设置VS2015支持调试进框架源代码

  Tools -> Options -> Debugging ->Symbols -> General中,勾选Enable .NET Framework source stepping和Enable source server support 两个选项。

  现在就可以进行单步调试进.NET Core的源代码中了,只是第一次DEBUG加载的时候,会非常的慢,符号服务器在国外嘛,真的是比较慢,而且不会一次性全部下载并加载进来,可能在调试到某些断点时,还要进行符号文件的下载,不过这种方法,也有好的一面,比如所有代码都能看到源代和调试了包括.NET Core的Fx。

三、项目中添加ASP.NET Core源代码

  第二种方式,是通过将源代码加入到项目中以达到代码调试的能力。这次以ASP.NET Core的源代码为例,同学们可以举一反三,这次使用的环境为.NET Core 1.0.1,当然ASP.NET Core MVC项目的版本也要与之对应。

1.Clone源代码

 我们先Clone一份ASPNETCore.MVC的源代码到本地,因为我们这次使用的版本是1.0.1所以Clone后查看下包括的版本信息。

D:\Projects\AspNet\Mvc [master ≡]> git tag
1.0.0
1.0.0-rc2
1.0.1
6.0.0-alpha2
6.0.0-alpha3
6.0.0-alpha4
6.0.0-beta1
6.0.0-beta2
6.0.0-beta3
6.0.0-beta4
6.0.0-beta5
6.0.0-beta6
6.0.0-beta7
6.0.0-beta8
6.0.0-rc1
rel/1.0.1
D:\Projects\AspNet\Mvc [master ≡]>

  我们需要的版本为rel/1.0.1,如果Clone的版本不正确也可以git checkout 1.0.1下。

  2.修改global.json

  接下来,我们要修改项目根目录中的global.json文件:

{
  "projects": [ "src", "test", "D:\\Projects\\AspNet\\Mvc\\src" ],
  "sdk": {
    "version": "1.0.0-preview2-003131"
  }
}

  在文件加入Clone下来的ASPNETCore源代码的路径。当然这里要注意,VS2015里创建项目模板可能会有版本问题,SDK使用的是1.0.0-preview2-003131版本,还有project.json里的程序集版本也要与源代码提供的版本保持一致!完成这个步骤后我们等待一会,整个项目就是重新来还原包信息和编译。

  当然还是会出现一些小问题,比如项目编译时会找不到AspNetCore项目编译出来的DLL文件,这是因为如果Clone下来的源代码与你的项目不在一个目录下的话,会导致找不到编译出来的程序集,解决方法也很简单,修改下编译参数,我的做法是修改.xproj的方法。

  将下载的ASP.NET Core的源代码中的项目文件 *.xproj 依次打开找到如下行:

<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin\</OutputPath>

将其修改为:

<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>

四、写在最后

好了经过以上的步骤,现在再编译就可以通过了,接下来,下断点吧。 以上的两种方法都可以举一反三,找到符号文件或编译源代码加入项目目录,都可以编译调试任何.NET Core开源代码。

GitHub:https://github.com/maxzhang1985/YOYOFx  如果觉还可以请Star下, 欢迎一起交流。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ASP.NETCore

.NET Core中使用Razor模板引擎

 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作;在以前我们一般常用的有Razor、NVeocity、VTemplate。虽然所有的模...

36930
来自专栏ASP.NETCore

.NET Core中ADO.NET SqlClient的使用与常见问题

  在很多要求性能的项目中,我们都要使用传统的ADO.NET的方式来完成我们日常的工作;目前有一些网友问有关于.NET Core操作SQL Server的问题在...

39410
来自专栏ASP.NETCore

.NET Core爬坑记 1.0 项目文件

  之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的、有API方面的,今天要讲的是编译方面的...

12630
来自专栏ASP.NETCore

ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninjec...

18540
来自专栏ASP.NETCore

在.NET Core程序中设置全局异常处理

但是在.NET Core中并没有AppDomain的相关实现,至少在.NET Core最新的发布版本里没有。

16230
来自专栏ASP.NETCore

.NET Core扩展IServiceCollection自动注册服务

在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中,通过IServiceCollecti...

42020
来自专栏ASP.NETCore

【干货】”首个“ .NET Core 验证码组件

众所周知,Dotnet Core目前没有图形API,以前的System.Drawing程序集并没有包含在Dotnet Core 1.0环境中。不过在dotne...

21340
来自专栏ASP.NETCore

解决VS Code调试.NET Core应用遇到的坑

  博客园里有好多介绍怎么使用VS Code以及调试.NET Core的文章,但是都是基于直接构建Asp.Net Core Mvc单项目的,有什么区别呢!

17940
来自专栏ASP.NETCore

.NET Core第三方开源Web框架YOYOFx

YOYOFx是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台。

87240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励