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# 代码调试的资料请关注我们其它相关文章!

(0)

相关推荐

  • C# Web应用调试开启外部访问步骤解析

    在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 设置内网访问 设置外网访问 1. 设置内网访问 在设置之前,本机环境如下: 操作系统:win7 IDE:Visual Studio 2010 应用:ASP.net 想要实现局域网内其他机器访问本机web应用包含以下4步: 第一步:设置启动方式为IIS Express Visual Studio 运行Web应用时,默认采用自身的

  • VSCode调试C#程序及附缺失.dll文件的解决办法

    刚开始使用VScode,经过两天的折腾,初步解决了调试C#无法生成.dll文件的问题,现将我的过程叙述如下(使用到.Net Core+VScode+C#插件). 1.首先在D盘建立一个新的文件夹,我的文件名是C# file,如下: 2.然后打开VS code,通过file -> Add Folder to Workspace选项将刚才建立的新的文件夹加入到工作空间中,如下: 3.通过命令Ctrl+shift+y打开调试控制台(DEBUG CONSOLE),然后选择终端(TERMINAL),会看到

  • C#中利用断点操作调试程序的步骤详解

    Visual Studio调试器调试 我们大家都知道,当代码不能正常运行时,可以通过调试定位错误.常用的程序调试操作包括设置断点.开始.中断和停止程序的执行.单步执行程序以及使程序运行到指定的位置.下面将对这几种常用的程序调试操作进行详细地介绍.话不多说了,来一起看看详细的介绍吧. 1.断点操作 断点通知调试器,使应用程序在某点上(暂停执行)或某情况发生时中断.发生中断时,称程序和调试器处于中断模式.进入中断模式并不会终止或结束程序的执行,所有元素(如函数.变量和对象)都保留在内存中.执行可以在

  • C#中一些你可能没用过的调试窗口的方法

    首先说明:如果没有进入调试模式的话,默认的调试窗口如下: 开始前的准备: 新建控制台程序DebugWindowDemo: 修改Program.cs 的代码为: 复制代码 代码如下: using System;using System.Threading;using System.Threading.Tasks;using System.Diagnostics; class S    {       public static void Main()        {            pco

  • C#使用Windows Service的简单教程(创建、安装、卸载、调试)

    前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务.本文就向大家介绍如何运用C#来创建.安装.卸载.调试Windows Service程序. 一.创建Windows服

  • C# 动态编译、动态执行、动态调试

    在此基础上我做了一些封装,为使调用更加简单,并增加了对动态代码调试的支持,相同代码只编译一次的支持,代码改动自动重新编译,代码引用文件的自动加载和手工加载等功能. 如上图,我封装的类CSharpProvider很简单,下面说明一下一些公共成员的用法. 公共属性 AssemblyFileName:这个属性指定动态编译后生成的配件名称. CompilerParameters:这个属性指定编译的参数 References:这个属性指定被编译代码中的引用.调用者只要调用References.Add("x

  • C#动态加载组件后如何在开发环境中调试详解

    动态加载组件 那就是简单的Assembly.Load动态加载dll而以.这网上资料也有不少.基本的思路基本上就是在本地上一个指定目录如[plugs]存在着一堆dll文件.主程序在初始运行时一般会把指定目录下的dll一次性用Assembly.Load加载进来.只要把指定目录变成从网络加载,或者加载指定目录前先检查网络上的是否有新版本.这就简单做成个最简单版本的热更新. 多数网上的资料就是然后就没有然后了.很多人就发现产品是通过动态加载组件了.但开发人员根本无法调试啊.不能调试就意味着开发难度大啊.

  • C#客户端程序Visual Studio远程调试的方法详解

    一,需求来源 在开发过程中,可能会要使用Win7 ,Win8 ,Win10等不同版本的系统去做兼容性调试,也有时候会去针对特别的显卡,无线网卡等等硬件设备的机器做优化,有一种较优的方案,那就是使用Visual Studio的远程调试功能,可以直接将测试机作为调试目标,直接跟踪断点和异常,可以像在本机调试一样,迅速的找到错误的地方.,而不需要在测试机安装VS环境. >传统桌面客户端的远程调试相比UWP,ASP等项目来说,配置比较麻烦,因为它是非部署的应用程序,原理是复制编译的文件到远程计算机,通过

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

    一:背景 1. 讲故事 每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇: 我去,本地环境代码跑的哧溜,上了测试环境出问题 我去, 第三方提供的 dll 跑出 bug 了 二:两个大坑的解决方案 1. 本地环境没问题,上了测试出问题 相信很多朋友都有我这样类似的遭遇,明明程序代码,配置文件都一样,挪了一个窝就出问题,你说气人不,既然问题出了那怎么快速解决呢? 对,就是用调试,但程序部署在 centos 上,送一个 vis

  • 分享Visual Studio原生开发的10个调试技巧

    最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧: 异常中断 | Break on Exception Watch窗口中的伪变量 |

  • 教你如何使用VS远程调试

    从VS2010的安装目录里面,找到D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger文件夹 拷贝Remote Debugger文件夹到目标机器(程序运行机器) 运行mvsmon.exe,设置工具-选项为Windows身份验证,否则断点会不起作用 控制面板的用户选项里面,添加和远程机相同的用户命,密码,可以在用户管理里直接添加. shift+右键--以其他身份运行-启动VisualStudi

  • JavaScrip调试技巧之断点调试

    首先,在各个浏览器中,断点调试支持的最好的当然是Firefox,Firefox不仅可以使用Firebug调试页面js脚本,还可以用高级调试工具例如JavaScript Debugger (Venkman) 来调试Firefox扩展里的js.除此之外,Firefox还支持一些更为高级的断点调试.变量监视功能. 其他浏览器里,Opera.Chrome和Safari的调试功能也比较好用.Opera的DragonFly速度相对比较快,界面清爽,功能强大,但不如Safari等友好.相比来说,IE8的程序员

  • idea远程调试spark的步骤讲解

    spark 远端调试 本地调试远端集群运行的spark项目,当spark项目在集群上报错,但是本地又查不出问题时,最好的方式就是调试一步一步跟踪代码.但是在集群上的代码又不能像本地一样的调试.那么就试试这个调试方法吧. 远程调试spark其实就四步: * 第一步jar包拷贝到集群master节点. * 第二步在 idea 中配置远程机器的IP 和调试端口号. * 第三步:启动远端的spark项目. * 第四步 启动idea 进行调试. 首先 首先了解jvm一些参数属性 -Xdebug -Xrun

  • IDEA实现远程调试步骤详解

    IDEA不仅可以本地调试代码,也可以远程调试代码. 一.基本原理 本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信,传递调试指令和调试信息.  被调试程序的远程虚拟机:作为 Debug 服务端,监听 Debug 调试指令.jdwp是Java Debug Wire Protocol的缩写.  调试程序的本地虚拟机:IDEA 中配置的 Remote Server,指定 Debug 服务器的Host:Port,以供 Debug 客户端程序连接. 二.远程调试步骤 1.ID

  • Spring Boot开启远程调试的方法

    前言 上周末一个朋友庆生,无意间听他说起了近况,说公司项目太多了,每天一堆BUG需要修复,项目来回切换启动,真是挺烦的. 随着项目越来越多,特别是身处外包公司的朋友,每天可能需要切换两三个项目,难道一有问题就本地启动项目调试? 今天这篇文章就来介绍一下什么是远程调试,Spring Boot如何开启远程调试? 什么是远程调试? 所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在

  • 基于IDEA 的远程调试 Weblogic的操作过程

    目录 基于IDEA 的远程调试 Weblogic 背景 操作过程 docker 相关配置 IDEA 相关配置 基于IDEA 的远程调试 Weblogic 使用环境 docker + vulhub 腾讯云上部署docker,docker上部署vulhub中的weblogic 背景 IDEA 可以在无源代码的情况下进行远程调试,只需将程序的 class文件或 jar包添加进项目依赖即可对一些未开源的 Java程序 或大型中间件进行远程调试. 操作过程 docker 相关配置 进入vulhub 的 w

  • 使用phpstorm和xdebug实现远程调试的方法

    vs的断点调试功能很强大有木有,能查看所有变量有木有.php调试很麻烦有木有,echo,var_dump写得你想吐了有木有.想体验一下ide调试的快感吗?那就来使用xdebug吧. 1.原理:xdebug是一款php调试插件,支持远程调试,就是在php文件运行的时候,能通过tcp协议,来发送调试信息到远程端口,ide在收到调试信息的时候,可以向xdebug发送单步运行,中止运行,运行等命令.这样就实现了vs那样强大的调试功能. 2.需要的东东:一款支持xdebug远程调试的ide,这里使用php

  • Java项目开启远程调试的方法步骤(tomcat、springboot)

    当我们运行一个项目的时候,一般都是在本地进行debug.但是如果是一个分布式的微服务,这时候我们选择远程debug是我们开发的利器. 环境 apache-tomcat-8.5.16 Linux 如何启用远程调试 tomcat开启远程调试 方法 切换到你的tomcat的bin目录/apache-tomcat-8.5.16/bin 下,执行: ./catalina.sh jpda start 执行上面的命令就可以开启远程debug了,如果想配置一些信息,比如端口号什么的,请参考下面的说明. 参数说明

随机推荐