c# 代码调试技巧和如何远程调试

 更新时间:2020年11月06日 08:35:30   作者:一线码农  
这篇文章主要介绍了c# 代码调试技巧和如何远程调试,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下

一:背景

1. 讲故事

每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇:

我去,本地环境代码跑的哧溜,上了测试环境出问题
我去, 第三方提供的 dll 跑出 bug 了

二:两个大坑的解决方案

1. 本地环境没问题,上了测试出问题

相信很多朋友都有我这样类似的遭遇,明明程序代码,配置文件都一样,挪了一个窝就出问题,你说气人不,既然问题出了那怎么快速解决呢? 对,就是用调试,但程序部署在 centos 上,送一个 visualstudio 上去也不现实,在这种限制级条件下还想调试怎么办呢?不错,可以上远程调试,然后就很快查到了测试机器中的某一个环境变量搞错了,事情的来龙去脉搞清楚了,接下来就看看怎么实现 local 到 centos 的 远程调试。

1) 测试代码
为了方便演示,我就在 Action 中读取 strategy 环境变量。

  public class HomeController : Controller
  {
    public IActionResult Index()
    {
      ViewBag.strategy = Environment.GetEnvironmentVariable("strategy");

      return View();
    }
  }

2) 安装 SSH
要远程调试,需要在远端机安装 SSH,因为后面附加进程调试 就要借助 SSH 打通。

yum install openssh-server unzip curl

安装完成后,就能看到 22 端口已启动

[root@localhost data]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Address     State    PID/Program name  
tcp    0   0 0.0.0.0:22       0.0.0.0:*        LISTEN   1126/sshd      
tcp    0   0 127.0.0.1:631      0.0.0.0:*        LISTEN   3037/cupsd     
tcp    0   0 127.0.0.1:25      0.0.0.0:*        LISTEN   1739/master  
tcp6    0   0 :::22          :::*          LISTEN   1126/sshd      
tcp6    0   0 ::1:631         :::*          LISTEN   3037/cupsd     
tcp6    0   0 ::1:25         :::*          LISTEN   1739/master 

3) 程序的发布配置
发布配置上,第一个要确保是 debug 版本,第二个要确保是 可移植模式 (Portable), 如下图:

4) 使用附加进程调试
在菜单栏依次选择:Debug -> Attach To Process,然后填写 ssh 需要的各种信息,如下图:

点击 Connect 后,就能看到远端机器的 dotnet程序 进程号,选择该进程进行附加,在 Select Code Type 中选择 Nanaged (.NET Core for Unix)即可,如下图:

5) 顺利调试
在 浏览器中键入: http://192.168.142.130/Home/Index ,可以看到我的 C# 代码被命中,也顺利的拿到了远端机器的 环境变量,问题也就迎刃而解。

2. 第三方 dll 出 bug 了

调试程序除了使用 F9 进行调试,相信也有不少朋友知道断点是可以编辑的,比如说:设置表达式断点,过滤器断点,命中次数断点,动作断点,下如图:

第一个问题就来了,这些花式断点,你真的会用吗?真的会经常用吗?

让我来回答的话,不到万不得已我是不会用的,我更愿意在代码中加入利于调试的测试语句,原因有三点:

  • 更加灵活

这个显而易见,在面板中设置条件相比用纯语句设置要麻烦得多,点来点去,而且还要条件叠加,复杂的很,我是不喜欢。

  • 功能强大

编辑面板上只有简单的并且关系,而且各个条件还是同级别的,无法做到各个条件的或者关系以及层级或者递归的包含关系,所以。。。没办法。。。

  • 更易于保存

这个就有意思了,在断点上右键是弹出编辑面板,点击左键是关闭断点,问题就出在这里,经常由于手贱,本想点右键结果点了左键 😨😨😨。。。。 好不容易设置好的条件没了。。。真的没了😭😭😭,从此以后,路转黑。如下图:

那这么说断点编辑真的没用吗? 我觉得只有在不能修改语句的调试场景下能够大显身手,比如我遇到的调试厂家封装的dll,哈哈,既然说到了断点,我就用 dnspy 演示几个断点给大家复习一下吧!

1) 测试代码
为方便演示,用 for 循环案例是最好的。

    public static void Main(string[] args)
    {
      var sum = 0;

      for (int i = 0; i < 10000; i++)
      {
        sum += i;
      }

      Console.WriteLine($"sum={sum}");
    }

2) 我希望在 sum = 1035 的时候命中断点
这个用条件表达式断点就可以了,非常简单,如下所示:

3) 找到所有能够被 1800 整除的数,并且记录下当时的 i 和 sum 值
这里就可以用到 Action 断点的日志记录,在 for 循环迭代中,不需要中断断点,只需记录某一个特定状态下当前的 i 和 sum 的值,对调试代码非常有帮助,如下图:

三:总结
总的来说这两个经验也算我一步一步踩坑过来的,如果能帮到你就更好了,本篇就聊这么多,下篇再见!

以上就是c# 代码调试技巧和如何远程调试的详细内容,更多关于c# 代码调试的资料请关注脚本之家其它相关文章!

相关文章

  • C#多线程之线程绑定ThreadLocal类

    C#多线程之线程绑定ThreadLocal类

    这篇文章介绍了C#多线程之线程绑定ThreadLocal类的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#中的问号(?号)用法小结

    C#中的问号(?号)用法小结

    这篇文章主要介绍了C#中的问号(?号)用法小结,本文介绍了3种用法,分别作为修饰符、运算符的用法,需要的朋友可以参考下
    2014-07-07
  • C#文件目录操作方法汇总

    C#文件目录操作方法汇总

    本文主要列举出C#文件和目录操作的一些方法,包括创建、移动、遍历目录,读写文件等方法,有需要的小伙伴可以学习一下。
    2016-04-04
  • 在unity脚本中控制Inspector面板的参数操作

    在unity脚本中控制Inspector面板的参数操作

    这篇文章主要介绍了在unity脚本中控制Inspector面板的参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#实现协变和逆变案例

    C#实现协变和逆变案例

    这篇文章介绍了C#实现协变和逆变的案例,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 基于为何我不喜欢用Path.Combine的详解

    基于为何我不喜欢用Path.Combine的详解

    本篇文章对是为什么我不喜欢用Path.Combine做了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C# pictureBox用法案例详解

    C# pictureBox用法案例详解

    这篇文章主要介绍了C# pictureBox用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详解C# 网络编程系列:实现类似QQ的即时通信程序

    详解C# 网络编程系列:实现类似QQ的即时通信程序

    本篇主要介绍了c#实现类似QQ的即时通信程序 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • C#操作windows系统进程的方法

    C#操作windows系统进程的方法

    这篇文章主要介绍了C#操作windows系统进程的方法,涉及C#针对windows操作系统进程的创建与关闭的技巧,需要的朋友可以参考下
    2015-04-04
  • 解析C# Console 控制台为什么也会卡死(原因分析)

    解析C# Console 控制台为什么也会卡死(原因分析)

    在分析旅程中,总会有几例控制台的意外卡死导致的生产事故,有经验的朋友都知道,控制台卡死一般是动了快速编辑窗口的缘故,虽然知道缘由,但一直没有时间探究底层原理,市面上也没有对这块的底层原理介绍,昨天花了点时间简单探究了下,感兴趣的朋友一起看看吧
    2023-10-10

最新评论