记一次 .NET 某车零件MES系统 登录异常分析

一次,net,零件,mes,系统,登录,异常,分析 · 浏览次数 : 1542

小编点评

**1. WinDbg 分析** * 首先需要抓取程序的 dump 文件,分析线程栈可以找出问题的关键线程。 * 通过观察线程栈,可以确定 14 号线程在等待 MySql.Data.Common.Ssl.StartSSL 方法。 * 从 mysql 的连接串中可以判断是否使用 SslMode=None,如果使用,则可能出现超时问题。 **2. SslMode=None标记** * 将 SslMode 设置为 None 可以绕过 SSL 验证,但这个操作会影响性能,并且可能存在安全风险。 * 在这种情况下,需要向朋友说明问题并采取相应的措施,例如更换使用 SSL 的服务器。 **3. 总结** 该问题是一个开发人员很难解决的问题,因为缺少代码、日志等信息,需要通过分析线程栈、连接串等信息来定位问题。如果沟通对象是非开发人员,没有代码和日志,则解决问题会非常困难。

正文

一:背景

1. 讲故事

这个案例有点特殊,以前dump分析都是和软件工程师打交道,这次和非业内人士交流,隔行如隔山,从指导dump怎么抓到问题解决,需要一个强大的耐心。

前几天有位朋友在微信上找到我,说他们公司采购的MES系统登录的时候出现了异常,让我帮忙看一下,我在想解铃还须系铃人,怎么的也不应该找到我呀,据朋友反馈项目已经验收,那边给了回馈是网络的问题,可能没有帮他们更深入的分析吧,找我的目的应该就是验证下对方公司说的对不对 😂😂😂

二:WinDbg 分析

1. 真的是网络问题吗

在没有项目源代码和日志的情况下,最好的方式就是抓dump,一样可以找出问题所在,让朋友在程序登录卡死的时候抓了一个dump,接下来看下是不是对方工程师所说的网络问题。

因为有卡死发生,必然有一个线程在等待什么,我们可以用 ~*e !clrstack 看下所有的线程的线程栈。


0:000:x86> ~*e !clrstack
...
OS Thread Id: 0x2094 (14)
Child SP       IP Call Site
0f94e888 0000002b [GCFrame: 0f94e888] 
0f94e938 0000002b [HelperMethodFrame_1OBJ: 0f94e938] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)
...
0f94ead0 6b53d7b6 System.Threading.Tasks.Task.Wait(Int32, System.Threading.CancellationToken) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 3167]
0f94eae0 1468ae6b MySql.Data.Common.Ssl.StartSSL(System.IO.Stream ByRef, System.Text.Encoding, System.String)
0f94eb38 14687a55 MySql.Data.MySqlClient.NativeDriver.Open()
0f94ec04 14686e63 MySql.Data.MySqlClient.Driver.Open()
0f94ec28 14686ac7 MySql.Data.MySqlClient.Driver.Create(MySql.Data.MySqlClient.MySqlConnectionStringBuilder)
0f94ec50 146869ec MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
0f94ec58 14686957 MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
0f94ec8c 146863e9 MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
0f94ecac 146862ca MySql.Data.MySqlClient.MySqlPool.GetConnection()
0f94ece0 146817c1 MySql.Data.MySqlClient.MySqlConnection.Open()
0f94ed18 0ca28753 xxx.GetMySqlConnection()
...
0f94efec 0ca21902 xxx.UserLogin(System.String, System.String)
...
0f94f4ac 6b4ae9db System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() [f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs @ 1161]
0f94f6cc 6c500556 [DebuggerU2MCatchHandlerFrame: 0f94f6cc] 
...

通过观察发现 14 号线程在一个 xxx.UserLogin 方法中,应该就是朋友点击的登录按钮的逻辑,通读一下线程栈可以看到它是在 MySql.Data.Common.Ssl.StartSSL 方法中等待,看样子是在这里超时了。

一般来说 mysql 是内网的话,不会特别去配什么 ssl 证书,这个太麻烦了,接下来验证下 mysql 是内网还是外网,可以用 !dso 查看mysql 的连接串。

从上面的 192.168 前缀来看果然是内网,这时候猜测走 SSL 肯定是意料之外的场景。

2. 真的要走 SSL

记得大概3-4年前在上海上班的时候,曾经有一个项目升级之后使用了nuget上的 mysql 8.0,然后项目就无法访问了,报了什么授权错误,看样子应该就是目前这个项目遇到的场景。

接下来要验证下这个 mysql 的sdk 是 8.0 的版本吗? 可以用 lm 找下 MySQL.Data 模块。


0:014:x86> lm
start    end        module name
...
12b40000 12ca6000   MySql_Data   (deferred)    
...

0:014:x86> lm vm MySql_Data
Browse full module list
start    end        module name
12b40000 12ca6000   MySql_Data   (deferred)             
    Image path: C:\Users\xxxx\MySql.Data.dll
    Image name: MySql.Data.dll
    Browse all global symbols  functions  data
    Has CLR image header, track-debug-data flag not set
    Image was built with /Brepro flag.
    Timestamp:        95CE4983 (This is a reproducible build file hash, not a timestamp)
    CheckSum:         001611FF
    ImageSize:        00166000
    File version:     8.0.29.0
    Product version:  8.0.29.0
    File flags:       0 (Mask 3F)
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0000.04b0
    Information from resource tables:
        CompanyName:      Oracle
        ProductName:      MySql.Data.Core
        InternalName:     MySql.Data.dll
        OriginalFilename: MySql.Data.dll
        ProductVersion:   8.0.29
        FileVersion:      8.0.29.0
        FileDescription:  MySql.Data
        LegalCopyright:   Copyright © 2016, 2020, Oracle and/or its affiliates. All rights reserved.
        LegalTrademarks:  
        Comments:         ADO.Net driver for MySQL for .Net Framework and .Net Core

从上面的 Product version 来看果然是 8.0 版本,验证了我的猜想,接下来就是让朋友在连接串中加上 SslMode=None 标记,类似下面这样。


<add key="上报平台1" value="mysql|Database = drp; Data Source = 192.168.xx.xx; port = 3306; User Id = xxx; Password = xxx;SslMode=None" />

把结果告诉朋友之后,朋友第二天反馈问题搞定。

不过他做了一个大胆的操作,禁用了 MySQL 的 hava_openssl

说实话这个影响面太大了,副作用小一点的话加上一个后缀就好,不管怎么样解决了问题就行。

三:总结

总的来说这个问题对一个开发来说很简单,但如果沟通对象是一个非开发,没有源码,没有日志 还能准确定位问题,是一件挺有挑战的事情。

图片名称

与记一次 .NET 某车零件MES系统 登录异常分析相似的内容:

记一次 .NET 某车零件MES系统 登录异常分析

一:背景 1. 讲故事 这个案例有点特殊,以前dump分析都是和软件工程师打交道,这次和非业内人士交流,隔行如隔山,从指导dump怎么抓到问题解决,需要一个强大的耐心。 前几天有位朋友在微信上找到我,说他们公司采购的MES系统登录的时候出现了异常,让我帮忙看一下,我在想解铃还须系铃人,怎么的也不应该

记一次 .NET某网络边缘计算系统 卡死分析

一:背景 1. 讲故事 早就听说过有什么 网络边缘计算,这次还真给遇到了,有点意思,问了下 chatgpt 这是干嘛的 ? 网络边缘计算是一种计算模型,它将计算能力和数据存储位置从传统的集中式数据中心向网络边缘的用户设备、传感器和其他物联网设备移动。这种模型的目的是在接近数据生成源头的地方提供更快速

记一次 .NET某机械臂上位系统 卡死分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序会偶发性的卡死一段时间,然后又好了,让我帮忙看下怎么回事?窗体类的程序解决起来相对来说比较简单,让朋友用procdump自动抓一个卡死时的dump,拿到dump之后,上 windbg 说话。 二:WinDbg 分析 1. 主线程在做什么 要想

记一次 .NET某工厂报警监控设置 崩溃分析

一:背景 1. 讲故事 前些天有位朋友在微信上丢了一个崩溃的dump给我,让我帮忙看下为什么出现了崩溃,在 Windows 的事件查看器上显示的是经典的 访问违例 ,即 c0000005 错误码,不管怎么说有dump就可以上windbg开干了。 二:WinDbg 分析 1. 程序为谁崩溃了 在 Wi

记一次 .NET某游戏币自助机后端 内存暴涨分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序内存会偶发性暴涨,自己分析了下是非托管内存问题,让我帮忙看下怎么回事?哈哈,看到这个dump我还是非常有兴趣的,居然还有这种游戏币自助机类型的程序,下次去大玩家看看他们出币的机器后端是不是C#写的?由于dump是linux上的程序,刚好win

记一次 .NET某工控视觉自动化系统 卡死分析

一:背景 1. 讲故事 今天分享的dump是训练营里一位学员的,从一个啥也不会到现在分析的有模有样,真的是看他成长起来的,调试技术学会了就是真真实实自己的,话不多说,上windbg说话。 二:WinDbg 分析 1. 为什么会卡死 这位学员是从事工控大类下的视觉自动化,也是目前.NET的主战场,这个

记一次 .NET某质量检测中心系统 崩溃分析

一:背景 1. 讲故事 这些天有点意思,遇到的几个程序故障都是和Windows操作系统或者第三方组件有关系,真的有点无语,今天就带给大家一例 IIS 相关的与大家分享,这是一家国企的.NET程序,出现了崩溃急需分析。 二:WinDbg 分析 1. 为什么会崩溃 崩溃原因相对还是好找的,双击dump文

记一次 .NET某工业设计软件 崩溃分析

一:背景 1. 讲故事 前些天有位朋友找到我,说他的软件在客户那边不知道什么原因崩掉了,从windows事件日志看崩溃在 clr 里,让我能否帮忙定位下,dump 也抓到了,既然dump有了,接下来就上 windbg 分析吧。 二:WinDbg 分析 1. 为什么崩溃在 clr 一般来说崩溃在clr

记一次 .NET某工控WPF程序被人恶搞的 卡死分析

一:背景 1. 讲故事 这一期程序故障除了做原理分析,还顺带吐槽一下,熟悉我的朋友都知道我分析dump是免费的,但免费不代表可以滥用我的宝贵时间,我不知道有些人故意恶搞卡死是想干嘛,不得而知,希望后面类似的事情越来越少吧!废话不多说,我们来看看是如何被恶搞的。 二:WinDbg 分析 1. 程序是如

记一次 .NET某企业数字化平台 崩溃分析

一:背景 1. 讲故事 前些天群里有一个朋友说他们软件会偶发崩溃,想分析看看是怎么回事,所幸的是自己会抓dump文件,有了dump就比较好分析了,接下来我们开始吧。 二:WinDbg 分析 1. 程序为什么会崩溃 windbg 还是非常强大的,当你双击打开的时候会自动帮你定位过去展示崩溃时刻的寄存器