一:背景

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系统 登录异常分析的更多相关文章

  1. 记一次 WinDbg 分析 .NET 某工厂MES系统 内存泄漏分析

    一:背景 1. 讲故事 上个月有位朋友加微信求助,说他的程序跑着跑着就内存爆掉了,寻求如何解决,截图如下: 从聊天内容看,这位朋友压力还是蛮大的,话说这貌似是我分析的第三个 MES 系统了,看样子 . ...

  2. 记一次 .NET 某纺织工厂 MES系统 API 挂死分析

    一:背景 1. 讲故事 这个月中旬,有位朋友加我wx求助他的程序线程占有率很高,寻求如何解决,截图如下: 说实话,和不同行业的程序员聊天还是蛮有意思的,广交朋友,也能扩大自己的圈子,朋友说他因为这个b ...

  3. 记一次 .NET 某三甲医院HIS系统 内存暴涨分析

    一:背景 1. 讲故事 前几天有位朋友加wx说他的程序遭遇了内存暴涨,求助如何分析? 和这位朋友聊下来,这个dump也是取自一个HIS系统,如朋友所说我这真的是和医院杠上了,这样也好,给自己攒点资源, ...

  4. 记一次 .NET 某WMS仓储打单系统 内存暴涨分析

    一:背景 1. 讲故事 七月中旬有一位朋友加wx求助,他的程序在生产上跑着跑着内存就飙起来了,貌似没有回头的趋势,询问如何解决,截图如下: 和这位朋友聊下来,感觉像是自己在小县城当了个小老板,规律的生 ...

  5. 记一次 .NET 某智慧物流 WCS系统 CPU 爆高分析

    一:背景 1. 讲故事 哈哈,再次见到物流类软件,上个月有位朋友找到我,说他的程序出现了 CPU 爆高,让我帮忙看下什么原因,由于那段时间在苦心研究 C++,分析和经验分享也就懈怠了,今天就给大家安排 ...

  6. 记一次 .NET某家装ERP系统 内存暴涨分析

    一:背景 1. 讲故事 前段时间微信上有一位老朋友找到我,说他的程序跑着跑着内存会突然爆高,有时候会下去,有什么会下不去,怀疑是不是某些情况下存在内存泄露,让我帮忙分析一下,其实内存泄露方面的问题还是 ...

  7. php 品牌全车零件订购平台( 带采集数据 及 账号自动登陆【已绕过https证书加密】,php源码 ,QQ: 876635409 )

    php捷豹路虎 品牌全车零件订购平台  ( 带采集数据 及 账号自动登陆[已绕过https证书加密],php源码 ,QQ: 876635409 [由于咨询用户太多,请备注:汽车配件]) 一.php+m ...

  8. 不了解MES系统中的看板管理?看完本文就懂了

    如果想要在生产车间中,让生产过程管理都处在“看得见”的状态,那么看板可视化管理的导入是你的不二选择. MES看板包括四个部分:生产任务看板.各生产单位生产情况看板.质量看板和物料看板,其中生产任务看板 ...

  9. 途虎养车Tuhu商城系统开发

    途虎养车Tuhu商城系统开发,咨询:何经理152-2217-7508(微信同号)途虎养车商城小程序开发,途虎养车商城小程序平台开发,途虎养车商城小程序系统开发. 为什么能做得这么好,里面的门道确实不少 ...

  10. 浅谈MES系统SMT的JIT功能(一):JIT原理

    前段时间帮忙客户实现了MES系统的SMT线上的JIT功能(JIT功能只适合电子行业的生产线),今天就来谈谈JIT功能是什么,为什么工厂车间需要用到JIT等等一些经验 首先说说JIT: 准时制生产方式( ...

随机推荐

  1. VS Code中使用live Server

    live server可以实时查看代码更改后的变化.测试十分快速. 1.安装live server 在扩展中搜索 live server,然后点击安装.等待安装完毕进行下一步配置. 2.打开设置界面: ...

  2. python+appium拉起APP

      1.首先需要完成环境配置: JDK:https://www.cnblogs.com/wenlongma/p/17103062.html: SDK:https://www.cnblogs.com/w ...

  3. echart 解决setOption线残留

    前言: Antd + echarts 我想要实现的是点击表的某一行自动生成对应的折线图,我在点击第一行生成5条线,我在点击第二行的时候,本该生成2条线,结果还是5条线: 最开始我以为设置的 serie ...

  4. 基于Mindspore2.0的GPT2预训练模型迁移教程

    摘要: 这篇文章主要目的是为了让大家能够清楚如何用MindSpore2.0来进行模型的迁移. 本文分享自华为云社区<MindNLP-基于Mindspore2.0的GPT2预训练模型迁移教程> ...

  5. 【数仓运维实践】关于GaussDB(DWS)单SQL磁盘空间管控

    摘要:本文主要讲解数仓运维中遇到单SQL磁盘空间管控问题的解析和方案. 本文分享自华为云社区<GaussDB(DWS)运维 -- 单SQL磁盘空间管控>,作者: 譡里个檔. [问题描述] ...

  6. 泰拉瑞亚EasyBuildMod便捷建造模组开发详细过程

    pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } github地址: ht ...

  7. Vue指令:内置指令和自定义指令

    Vue指令 Vue指令指的是,以v-开头的一组特殊语法 内置指令 v-text v-text指令的作用是:设置标签的内容 默认写法会替换全部内容,差值表达式{{ }}只会替换指定内容 内部支持写表达式 ...

  8. kubernetes (k8s) v1.24.0 安装dashboard面板

    kubernetes (k8s) v1.24.0 安装dashboard面板 介绍 v1.24.0 使用之前的安装方式,在安装过程中会有一些异常,此文档已修复已知问题. 下载所需配置 root@k8s ...

  9. docker方式实现redis数据持久化离线安装

    保存镜像 root@hello:~# docker pull redis:latest latest: Pulling from library/redis a2abf6c4d29d: Already ...

  10. 人工智能NVIDIA显卡计算(CUDA+CUDNN)平台搭建

    NVIDIA是GPU(图形处理器)的发明者,也是人工智能计算的引领者.我们创建了世界上最大的游戏平台和世界上最快的超级计算机. 第一步,首先安装N卡驱动. cby@cby-Inspiron-7577: ...