记一次 .NET 某埋线管理系统 崩溃分析
一:背景
1. 讲故事
经常有朋友跟我反馈,说看你的文章就像看天书一样,有没有一些简单入手的dump 让我们先找找感觉,哈哈,今天就给大家带来一篇入门级的案例,这里的入门是从 WinDbg 的角度来阐述的,这个问题如果你通过 记日志,分析代码 的方式,可能真的无法解决,不信的话继续往下看呗!
前段时间有位朋友微信上找到我,说他的程序崩溃了,也没找出是什么原因,然后就让朋友抓一个崩溃的dump让我看看。
二:WinDbg 分析
1. 崩溃原因在哪里
在 windbg 中有一个自动化的分析命令 !analyze -v 可以寻找到 miniDumpWriteDump 时塞入的 PMINIDUMP_EXCEPTION_INFORMATION 信息,结构如下:
typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
DWORD ThreadId;
PEXCEPTION_POINTERS ExceptionPointers;
BOOL ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
这个命令执行时间可能很长,要稍等片刻
0:000> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
CONTEXT: (.ecxr)
rax=0000000000000198 rbx=0000000000000001 rcx=0000000000000002
rdx=0000000039959600 rsi=0000000000000000 rdi=0000000039959600
rip=00007fffe1e4cba4 rsp=00000000010fc050 rbp=00000000010fc150
r8=0000000000000000 r9=000000003999b640 r10=0000000000000018
r11=00000000010fc020 r12=0000000000000000 r13=00000000010fc370
r14=000000004b727aa0 r15=0000000000000020
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202
igxelpicd64+0x1fcba4:
00007fff`e1e4cba4 488b08 mov rcx,qword ptr [rax] ds:00000000`00000198=????????????????
Resetting default scope
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00007fffe1e4cba4 (igxelpicd64+0x00000000001fcba4)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: 0000000000000198
Attempt to read from address 0000000000000198
PROCESS_NAME: xxx.exe
上面的崩溃点的汇编语句 mov rcx,qword ptr [rax] 说的非常清楚,访问0区的 0000000000000198 地址必然会是访问违例,接下来简单看一下汇编代码。
0:000> ub igxelpicd64+0x00000000001fcba4
igxelpicd64+0x1fcb80:
00007fff`e1e4cb80 418b09 mov ecx,dword ptr [r9]
00007fff`e1e4cb83 83f910 cmp ecx,10h
00007fff`e1e4cb86 0f83bb0a0000 jae igxelpicd64+0x1fd647 (00007fff`e1e4d647)
00007fff`e1e4cb8c 488d04cd21000000 lea rax,[rcx*8+21h]
00007fff`e1e4cb94 4803c1 add rax,rcx
00007fff`e1e4cb97 488d04c6 lea rax,[rsi+rax*8]
00007fff`e1e4cb9b 4885c0 test rax,rax
00007fff`e1e4cb9e 0f847c0c0000 je igxelpicd64+0x1fd820 (00007fff`e1e4d820)
从汇编代码看是一段 数组操作 的逻辑,捋汇编太累了,我们看下 igxelpicd64.dll 模块到底是谁写的,用 lmvm 观察下。
0:000> lmvm igxelpicd64
Browse full module list
start end module name
00007fff`e1c50000 00007fff`e2cfe000 igxelpicd64 (export symbols) igxelpicd64.dll
Loaded symbol image file: igxelpicd64.dll
Image path: C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf_amd64_ec5e4cdfcd3a62b8\igxelpicd64.dll
Image name: igxelpicd64.dll
Browse all global symbols functions data
Timestamp: Sat Jul 16 02:54:34 2022 (62D1B7EA)
CheckSum: 010A00BB
ImageSize: 010AE000
File version: 31.0.101.3251
Product version: 31.0.101.3251
File flags: 0 (Mask 3F)
File OS: 10004 DOS Win32
File type: 2.8 Dll
File date: 00000000.00000000
Translations: 0409.04b0
Information from resource tables:
CompanyName: Intel Corporation
ProductName: Intel HD Graphics Drivers for Windows(R)
InternalName: OpenGL
OriginalFilename: ig7icd32
ProductVersion: 31.0.101.3251
FileVersion: 31.0.101.3251
FileDescription: OpenGL(R) Driver for Intel(R) Graphics Accelerator
LegalCopyright: Copyright (c) 1998-2018 Intel Corporation.
从 OpenGL(R) Driver for Intel(R) Graphics Accelerator 来看原来是用来渲染 2D,3D 矢量图形的工具包哈,这东西太底层了,没玩过,不过有一点可以肯定的是这个 dll 是属于 Intel 的,那为什么会调用这个渲染功能呢? 这就需要观察线程栈了。
2. 谁在调用渲染
崩溃有两个场景,一个是崩溃前,一个是崩溃后,要看崩溃前的线程栈我们一定要知道崩溃前的状况,这里用 .ecxr 命令切换,简化后如下:
0:000> .ecxr ; k
rax=0000000000000198 rbx=0000000000000001 rcx=0000000000000002
rdx=0000000039959600 rsi=0000000000000000 rdi=0000000039959600
rip=00007fffe1e4cba4 rsp=00000000010fc050 rbp=00000000010fc150
r8=0000000000000000 r9=000000003999b640 r10=0000000000000018
r11=00000000010fc020 r12=0000000000000000 r13=00000000010fc370
r14=000000004b727aa0 r15=0000000000000020
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202
igxelpicd64+0x1fcba4:
00007fff`e1e4cba4 488b08 mov rcx,qword ptr [rax] ds:00000000`00000198=????????????????
*** Stack trace for last set context - .thread/.cxr resets it
# Child-SP RetAddr Call Site
00 00000000`010fc050 00007fff`e1e4c500 igxelpicd64+0x1fcba4
...
07 00000000`010fd430 00007fff`e503b788 igxelpicd64!DumpRegistryKeyDefinitions+0x11865
08 00000000`010fd490 00000000`324147f6 opengl32!glReadPixels+0x88
...
0c 00000000`010fd6d0 00007ff7`f5a3185a GSGlobeDotNet!GeoScene.Globe.GSOGlobe.ScreenToScene+0xa5
...
0e 00000000`010fe1b0 00007ff8`3285d810 System_Windows_Forms_ni!System.Windows.Forms.Control.OnMouseClick+0x9b
...
从线程栈看是用户点击了鼠标,进入了 GSGlobeDotNet.dll ,在读取像素的底层逻辑中抛了异常,然后到网上搜了一下,原来是绘制三维地球的工具包,这个了。

知道这些信息后,让朋友升级下 显卡驱动 试试,后来朋友改了显卡的设置就搞定了,截图如下:

三:总结
显卡的问题也能导致程序的崩溃,太不可思议了,试想一下你如果只是记日志,看代码,怎么可能找的出问题,哈哈哈,这就是高级调试的价值。

记一次 .NET 某埋线管理系统 崩溃分析的更多相关文章
- 记一次asp.net core 线上崩溃解决总结
1.首先要先准备好环境,安装lldb 工具 要安装3.9版本的,因为每个版本对应dnc版本不一样,3.9的支持2.2 版本,然后确定分析的机器里dnc 版本和线上的生产环境是否一致,自己安装比较费劲, ...
- 记一次 .NET 某药品仓储管理系统 卡死分析
一:背景 1. 讲故事 这个月初,有位朋友wx上找到我,说他的api过一段时间后,就会出现只有请求,没有响应的情况,截图如下: 从朋友的描述中看样子程序是被什么东西卡住了,这种卡死的问题解决起来相对简 ...
- 记一次 .NET 某医疗器械 程序崩溃分析
一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一 ...
- 记一次 .NET 某医疗住院系统 崩溃分析
一:背景 1. 讲故事 最近收到了两起程序崩溃的dump,查了下都是经典的 double free 造成的,蛮有意思,这里就抽一篇出来分享一下经验供后面的学习者避坑吧. 二:WinDbg 分析 1. ...
- 线上bug分析
昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...
- 基于UML的中职班主任工作管理系统的分析与设计--文献随笔(二)
一.基本信息 标题:基于UML的中职班主任工作管理系统的分析与设计 时间:2016 出版源:遵义航天工业学校 关键字:中职学校; 班主任工作管理; UML建模 二.研究背景 问题定义:班主任是一项特殊 ...
- 基于UML的毕业设计管理系统的分析与设计
基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:“我们要写一个关于UML的专著”,一句话:“一个完整的系统贯穿整个UML的知识”:我:“ ...
- MySQL慢日志线上问题分析及功能优化
本文来源于数据库内核专栏. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据 ...
- 记一次令人窒息的线上fullgc调优
今天第二篇采坑了... ... 现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节 情况是一台服务器一启动就开始full gc,短短1分钟可以有几 ...
- 记Booking.com iOS开发岗位线上笔试
今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为 ...
随机推荐
- 快速部署Ceph分布式高可用集群
快速部署Ceph分布式高可用集群 Ceph简介 Ceph是一个PB,EB级别的分布式存储系统,可以提供文件存储,对象存储.和块存储,它可靠性高,易扩展,管理简便,其中对象存储和块存储可以和其他云平台集 ...
- Redis 源码解析之通用双向链表(adlist)
Redis 源码解析之通用双向链表(adlist) 概述 Redis源码中广泛使用 adlist(A generic doubly linked list),作为一种通用的双向链表,用于简单的数据集合 ...
- Nvidia Tensor Core初探
1 背景 在基于深度学习卷积网络的图像处理领域,作为计算密集型的卷积算子一直都是工程优化的重点,而卷积计算一般转化为矩阵乘运算,所以优化矩阵乘运算自然成为深度学习框架最为关心的优化方向之一.鉴于此,N ...
- RDIF.vNext全新低代码快速开发框架平台发布
1.平台介绍 RDIF.vNext,全新低代码快速开发集成框架平台,给用户和开发者最佳的.Net框架平台方案,为企业快速构建跨平台.企业级的应用提供强大支持. RDIF.vNext的前身是RDIFra ...
- R读入数据
两种方式: edit()自动生成一个红色的表格,列名会自动的放上去,不够的会显示var5,var6,var7 mydata <- data.frame( age = numeric(0), ge ...
- Eclipse中添加Shell脚本(如start.sh)
Eclipse中添加Shell脚本(如start.sh) 使用eclipse时,我们有时候会在自己的工程文件下添加一些脚本(比如将Qt代码在eclipse中运行生成moc文件时,或者要拷贝 ...
- Centos7安装JDK1.8详细步骤
JDK 解压JDK安装文件.在终端中,进入你下载的JDK安装文件所在的目录,然后执行以下命令: tar -zxvf jdk-<版本号>-linux-x64.tar.gz 其中,<版本 ...
- 逍遥自在学C语言 | 条件控制的正确使用姿势
前言 在C语言中,有三种条件判断结构:if语句.if-else语句和switch语句. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白 ...
- 2020-10-30:给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。即求出: maxValue = max{arr[j]-arr[i] and j >= i}?
福哥答案2020-10-30:1.双重遍历法.2.一次遍历法.golang代码如下: package main import "fmt" const INT_MAX = int(^ ...
- nodejs 入门基本操作
操作fs模块 const path = require("path"); const fs = require("fs"); /* 相对路径是命令窗口执行的目录 ...