记一次 .NET某实验室自动进样系统 崩溃分析

news2024/9/23 11:21:23

一:背景

1. 讲故事

前些天有位朋友在微信上联系到我,说他们的程序在客户那边崩掉了,让我帮忙看下怎么回事,dump也拿到了,那就上手分析吧。

二:WinDbg 分析

1. 哪里的崩溃

既然是程序的崩溃,自然是有原因的,皮裤套棉裤,必定有缘故,不是皮裤太薄就是棉裤没毛,用 !analyze -v 观察下异常信息。


0:107> !analyze -v

CONTEXT:  (.ecxr)
rax=0000005e0dc7c4a0 rbx=0000005e0dc7c400 rcx=0000005e0dc7c4a0
rdx=0000000000000000 rsi=0000005e0dc7c3f0 rdi=0000005e0dc7c4a0
rip=00007ffb1ecfc223 rsp=0000005e0dc7c3c0 rbp=0000005e0dc7c4c0
 r8=00000000000004d0  r9=0000000000000000 r10=0000000000000000
r11=0000005e0dc7c4a0 r12=0000000000000000 r13=000002079d450220
r14=000002079b93aba0 r15=0000000000000000
iopl=0         nv up ei pl nz na pe nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000200
coreclr!EEPolicy::HandleFatalError+0x7f:
00007ffb`1ecfc223 488d442440      lea     rax,[rsp+40h]
Resetting default scope

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 00007ffb1ec6d70f (coreclr!ProcessCLRException+0x00000000000d9f7f)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000001
NumberParameters: 0

从卦中信息看这是一个经典的 访问违例,但崩溃在 EEPolicy::HandleFatalError 处就有点匪夷所思了,HandleFatalError 方法主要是用来在抛异常之前修整异常上下文的,这个方法固若金汤,一般不会出问题的,但不管怎么样,还是看下 rsp+40h 到底是什么东西。


0:107> dp rsp+40h L1
0000005e`0dc7c400  00000001`c0000005

上面的 c0000005 很显然是访问违例,看样子这里有点混乱,也不是第一崩溃现场,这里就不过多纠结了,那怎么去找真正的崩溃点呢?还有一个方法就是去找 RaiseException 或者 KiUserExceptionDispatch 返回点之前的有用函数,参考如下:


0:107> .ecxr
0:107> k
  *** Stack trace for last set context - .thread/.cxr resets it
 # Child-SP          RetAddr               Call Site
00 0000005e`0dc7c3c0 00007ffb`1ec6d72e     coreclr!EEPolicy::HandleFatalError+0x7f [D:\a\_work\1\s\src\coreclr\vm\eepolicy.cpp @ 776] 
01 0000005e`0dc7c9d0 00007ffb`5235292f     coreclr!ProcessCLRException+0xd9f9e [D:\a\_work\1\s\src\coreclr\vm\exceptionhandling.cpp @ 1036] 
02 0000005e`0dc7cc00 00007ffb`52302554     ntdll!RtlpExecuteHandlerForException+0xf
03 0000005e`0dc7cc30 00007ffb`5235143e     ntdll!RtlDispatchException+0x244
04 0000005e`0dc7d340 00000000`6c942893     ntdll!KiUserExceptionDispatch+0x2e
05 0000005e`0dc7daf0 00007ffa`c066ed7b     libxxx_manage!get_clean_xxx
06 0000005e`0dc7db70 00007ffa`c06b73a4     0x00007ffa`c066ed7b
...

从卦中看,程序崩溃在 libxxx_manage!get_clean_xxx 中,看样子是一个 C++ 写的动态链接库,这就有点无语了。。。

2. C++ 库为什么会崩

要想寻找答案,最好的办法就是观察 000000006c942893 处的汇编代码,参考如下:


0:107> ub 00000000`6c942893
libxxx_manage!get_clean_xxx:
00000000`6c942876 55              push    rbp
00000000`6c942877 53              push    rbx
00000000`6c942878 4883ec68        sub     rsp,68h
00000000`6c94287c 488dac2480000000 lea     rbp,[rsp+80h]
00000000`6c942884 48894d00        mov     qword ptr [rbp],rcx
00000000`6c942888 c745dc00000000  mov     dword ptr [rbp-24h],0
00000000`6c94288f 488b4500        mov     rax,qword ptr [rbp]

0:107> u 00000000`6c942893
00000000`6c942893 488b00          mov     rax,qword ptr [rax]

0:107> dp rbp L1
0000005e`0dc7c4c0  00000000`00000000

从上面的汇编代码来看,这是 get_clean_xxx 方法的序幕代码,问题出在 rbp 的内容为0上,但 rbp 又来自于 rcx,根据 x64调用协定,rcx 即方法的第一个参数,看样子是这个参数为 null 导致的,参考如下:


0:107> !address rcx

Usage:                  Stack
Base Address:           0000005e`0dc78000
End Address:            0000005e`0dc80000
Region Size:            00000000`00008000 (  32.000 kB)
State:                  00001000          MEM_COMMIT
Protect:                00000004          PAGE_READWRITE
Type:                   00020000          MEM_PRIVATE
Allocation Base:        0000005e`0db00000
Allocation Protect:     00000004          PAGE_READWRITE
More info:              ~107k

0:107> dp rcx L1
0000005e`0dc7c4a0  00000000`00000000

3. get_clean_xxx 参数为null吗

这个问题比较简单,继续用 !clrstack 观察下 Pinvoke 之上的 C# 代码。


0:107> !clrstack
OS Thread Id: 0x3508 (107)
        Child SP               IP Call Site
0000005E0DC7DBA0 00007ffac066ed7b [InlinedCallFrame: 0000005e0dc7dba0] xxx_LibPInvoke.xxx_clean_query(IntPtr)
0000005E0DC7DB70 00007ffac066ed7b ILStubClass.IL_STUB_PInvoke(IntPtr)
0000005E0DC7DC30 00007ffac06b73a4 xx+c__DisplayClass11_0.<xxxQueryClean>b__0(IntPtr)
...

接下来就是看下托管层的 C# 代码是如何写的,截图如下:

从图中可以清楚的看到,xxxChannel 传给C++ 的时候没有判断是否为null,导致崩溃的发生,那还有没有其他的佐证呢?其实也是有的,如果符号给力还可以使用 !clrstack -a 去找到 xxxChannel 传下去的值。


0:107> !clrstack -a
OS Thread Id: 0x3508 (107)
        Child SP               IP Call Site
0000005E0DC7DBA0 00007ffac066ed7b [InlinedCallFrame: 0000005e0dc7dba0] xxx_LibPInvoke.xxx_clean_query(IntPtr)
0000005E0DC7DB70 00007ffac066ed7b ILStubClass.IL_STUB_PInvoke(IntPtr)
    PARAMETERS:
        <no data>

0000005E0DC7DC30 00007ffac06b73a4 xxx+c__DisplayClass11_0.<xxxQueryClean>b__0(IntPtr)
    PARAMETERS:
        this (0x0000005E0DC7DC80) = 0x0000020a9d9ca8d8
        xxxChannel (0x0000005E0DC7DC88) = 0x0000000000000000
    LOCALS:
        0x0000005E0DC7DC6C = 0x0000000000000000
        0x0000005E0DC7DC68 = 0x0000000000000000

可以清楚的看到确实是 0,到这里就一切真相大白,对参数加一个判断即可,那这东西到底是谁的责任呢?我觉得双方都有问题吧。

  1. 写托管层的人有点飘。
  2. 写非托管层的人未作防御性编程,还是年轻太相信人了。

三:总结

这次生产事故彻底破坏了两个语言团队之间的相互合作的信任度,信任重建可就难了,不怕神一样的对手,就怕猪猪一样的队友,放在这里还是挺合适的,哈哈,开个小玩笑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《黑神话:悟空》中的黑科技及未来高端游戏展望

一、《黑神话&#xff1a;悟空》中的黑科技 1. 虚幻引擎5与次世代渲染技术 《黑神话&#xff1a;悟空》是首批采用虚幻引擎5&#xff08;Unreal Engine 5&#xff09;的游戏之一&#xff0c;虚幻引擎5代表了当前游戏引擎技术的顶尖水平。其核心技术“Nanite”和“Lumen”分别…

【学术英语】Unit3:Academic Writing(学术写作)

文章目录 一、摘要1.1 摘要简介1.2 摘要的两种类型1.3 写摘要的技巧1.4 摘要的关键词1.5 例子1.5.1 例子11.5.2 例子2 二、注释和致谢2.1 注释的格式2.1.1 Book2.1.2 论文2.1.3 例子 2.2 致谢的格式 三、书目选编 一、摘要 1.1 摘要简介 摘要对学术写作极其重要和有用&#x…

健康管理小程序怎么做 健康管理小程序系统开发制作方法

很多老板想要做一个自己公司的健康管理小程序&#xff0c;但是不知道该怎么做&#xff0c;本次瀚林就为大家详细介绍一下各种中心小程序系统的开发制作方法为大家做参考。 目前市面上的健康管理有很多类型例如常见的健康管理中心、健康服务平台、健康生活馆、健康科技管家、健康…

mysql定位慢查询和分析

1. 使用工具&#xff1f; 运维工具&#xff1a;skywalking&#xff0c;可以监测出哪个接口&#xff0c;然后找到对应的sql。2. 在调试阶段使用mysql配置&#xff1f; 确保慢查询日志功能已经开启。设置慢查询阈值&#xff08;可选&#xff09;。分析慢查询日志。 在调试阶段中…

不使用 JS 纯 CSS 获取屏幕宽高

在现代前端开发中&#xff0c;获取屏幕的宽度和高度通常依赖于 JavaScript。然而现代 CSS 也可以获取到屏幕的宽高&#xff0c;通过自定义属性&#xff08;CSS Variables&#xff09;和一些数学函数来实现这一目标。本文将详细解析如何使用 CSS 的 property 规则和一些数学运算…

ToB福音?专业场景数据生成的“大杀器”接连发布

Meta官方发布的LLaMA3.1-405B的各项得分 ©作者|格林 来源|神州问学 最近&#xff0c;AI领域掀起了一股数据合成的热潮&#xff0c;各大厂商最近推出的模型都或多或少有数据合成的影子。英伟达的Nemotron-4-340B-Instruct、微软的Orca-3&#xff0c;以及Meta的Meta-Llama…

三维尺寸公差分析软件哪个最好用?推荐上海棣拓自研软件DTAS

软件简介 国产自研-3D公差分析软件 DTAS 3D (Dimensional Tolerance Analysis System 3D)基于蒙特卡洛原理&#xff0c;按照产品的公差及装配关系进行建模&#xff0c;然后进行解析、仿真计算&#xff0c;最终预测产品设计是否能够满足其关键尺寸要求&#xff0c;同时预测产品…

【Linux操作系统】进程间通信(2)——共享内存

目录 一、共享内存 一、共享内存 共享内存的原理&#xff1a; 进程A把它的数据在地址空间中通过页表映射到物理内存中&#xff0c;进程B通过页表获取物理内存的物理地址&#xff0c;得到数据。 共享内存在物理内存可能有多个&#xff0c;那么两个进程如何确定找到的是同一个共…

深入了解搜索引擎蜘蛛:从定义到最新技术应用

撰写一篇关于搜索引擎蜘蛛的详细文章&#xff0c;需涵盖从基础概念到未来趋势的多个方面。以下是根据您提供的大纲撰写的长篇文章&#xff0c;适合用于了解搜索引擎蜘蛛的重要性及其在现代互联网中的作用。 1. 引言 在互联网的浩瀚世界中&#xff0c;搜索引擎就像是庞大的图书…

Ubuntu 22.04中MySQL 8 设置忽略大小写

Ubuntu 22.04中MySQL 8 设置忽略大小写 一、解决完整流程 //根据官网内容说的大概意思就是不能安装完了修改忽略大小写了&#xff0c;只能在初始化的时候做修改。我用的版本是8.0.39//更新软件包 1、sudo apt update //安装MySQL 如果安装了可以忽略这个步骤 2、sudo apt ins…

【网络】子网掩码

1.IP地址的表示形式 事实上在计算机内部IP地址是32位比特位的数字&#xff0c;为了方便表示&#xff0c;就会采用点分十进制的形式 上面这个是万变不离其中的。 本节重点介绍 IPv4 地址&#xff0c;该地址以四个十进制数字&#xff08;以句点分隔&#xff09;的形式表示&#…

spring security 自定义图形验证码(web/前后端分离)

一、准备工作 1.1 导入pom 所需依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><!-- <version>2.7.18</version>-->&l…

代码随想录算法训练营第13天 |二叉树的学习

目录 二叉树 理论基础 二叉树的分类 1. 满二叉树 (Full Binary Tree) 2. 完全二叉树 (Complete Binary Tree) 3. 平衡二叉树 (Balanced Binary Tree) 5. 二叉搜索树 (Binary Search Tree, BST) 二叉树的存储 1. 链式存储 (Linked Representation) 2. 顺序存储 (Sequent…

废酸处理业务

废酸处理是指将工业生产过程中产生的废酸进行有效处理&#xff0c;以实现其回收利用或安全排放的过程。这一过程对于环境保护和资源节约具有重要意义。以下是对废酸处理的详细介绍&#xff1a; 一、废酸处理的必要性 废酸中含有大量的有害物质&#xff0c;如重金属离子、有机物…

SAP ERP与长城汽车EDI业务集成案例(SAP CPI平台)

一、项目背景 某智能座舱公司是国内领先的智能座舱领域科技公司&#xff0c;致力于成为智能网联行业变革的领导者和推动者&#xff0c;聚焦整车域控制器产品、智能网联软件产品和运营服务产品&#xff1b; 已建成首条先进的数智化域控制器生产线&#xff0c;为客户提供最优…

零基础学PLC的指令-沿指令(2)

扫描操作数的信号上升沿&#xff1a; 在触点分配的 "IN" 位上检测到正跳变&#xff08;0->1&#xff09;时&#xff0c;该触点的状态为 TRUE。该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。P 触点可以放置在程序段中除分支结尾外的任何位置。 扫描…

【VUE入门级温故知新】一文向您详细介绍~组件注册(选项式API)

大家好&#xff0c;我是DX3906 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; 前面和大家分享了《如何从零开始创建一个 Vue 应用》 《VUE模板语法(超详细讲解)》 《一文向您详细介绍~Vu…

FTP服务器(服务名vsftpd,端口tcp/20和tcp/21)

目录 前言 配置文件 FTP服务器的配置 FTP服务的下载 配置防火墙 编辑配置文件 常用字段&#xff1a; 常用字段&#xff08;匿名用户&#xff09;&#xff1a; 常用字段&#xff08;系统用户&#xff09;&#xff1a; 指定系统用户访问&#xff1a; 编辑名单/etc/vsf…

AI预测体彩排3采取888=3策略+和值012路或胆码测试8月27日升级新模型预测第64弹

经过60多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;已到达90%的命中率&#xff0c;这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大部…

【GD32 MCU 移植教程】从 GD32F303 移植到 GD32F503

1. 前言 GD32E503 系列是 GD 推出的 Cortex_M33 系列产品&#xff0c;该系列资源上与 GD32F303 兼容度非常 高&#xff0c;本应用笔记旨在帮助您快速将应用程序从 GD32F303 系列微控制器移植到 GD32E503 系列微 控制器。 2. 引脚兼容性 GD32F303 与 GD32E503…