首页 > 其他分享 >记一次 .NET 某埋线管理系统 崩溃分析

记一次 .NET 某埋线管理系统 崩溃分析

时间:2023-07-01 10:03:07浏览次数:32  
标签:00007fff 管理系统 00000000 igxelpicd64 dll 002b NET 埋线 rax


一:背景

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 ,在读取像素的底层逻辑中抛了异常,然后到网上搜了一下,原来是绘制三维地球的工具包,这个

标签:00007fff,管理系统,00000000,igxelpicd64,dll,002b,NET,埋线,rax
From: https://blog.51cto.com/u_15353947/6598084

相关文章

  • Linux 上的 .NET 如何自主生成 Dump
    一:背景1.讲故事前几天微信上有位朋友找到我,说他程序的线程数会偶发性瞬时飙高,让我看下大概是什么原因,截图如下:如果这种问题每天都会出现,比较好的做法就是用dotnet-trace捕获ThreadCreated事件,但可气的是朋友说大概一个月发生次把,这种情况下用dotnet-trace持续监视就没必要......
  • [问题记录] com.netflix.hystrix.exception.HystrixRuntimeException timed-out and n
    报错描述服务重启后第一次访问调用Feign接口会503,走熔断器的fallback打一次断点后再访问就没有问题,服务重启后第一次访问打断点也是503解决方案Hystrix缺省超时判断为1秒钟,由于网络问题,有些请求超过1秒钟之后才接收到增加响应时间即可hystrix:command:defau......
  • .NET 7 新特性全面解析
    在2021年11月8日发布的.NET6当前已经广泛使用。微软团队已经开始着手为.NET7制定计划和新特性。本文将为您全面解析.NET7的新特性,并提供源代码示例。1.更好的性能.NET7将继续提高运行时性能,改进JIT编译器,减少内存分配,优化GC,以及提高ASP.NETCore和EntityF......
  • Net6 中一个请求用到的
    Microsoft.AspNetCore.Hosting.HttpRequestIn.StartMicrosoft.AspNetCore.Hosting.BeginRequestMicrosoft.AspNetCore.Routing.EndpointMatched 终结点匹配Microsoft.AspNetCore.Mvc.BeforeOnActionExecuting--动作执行前Microsoft.AspNetCore.Mvc.AfterOnActionExecuting......
  • kubernetes学习笔记06(存储)
    Kubernetes存储管理容器中的磁盘生命周期是短暂的,也带来了一系列的问题:当一个容器损坏后,Kubernetes会重启容器,但是文件会丢失很多容器在同一Pod中运行的时候,数据文件需要共享KubernetesVolume的到来解决了上述问题,Kubernetes集群中的存储跟Docker的存储卷有些类似,只不过Docker的存......
  • BACnet网关如何采集BACnet设备
    BL103BACnet网关是一款经济型楼宇自动化、暖通控制系统的物联网关,用于实现ModbusRTU、ModbusTCP、DL/T645、BACnetIP、BACnetMS/TP等多种协议转换为ModbusTCP、OPCUA、MQTT、BACnetIP、华为云IoT、亚马逊云IoT、阿里云IoT、ThingsBoard、金鸽云等协议的网关。BL103下行支......
  • BL103BACnet网关配置采集BACnet MS/TP网关
    BL103BACnet网关是一款经济型楼宇自动化、暖通控制系统的物联网关,用于实现ModbusRTU、ModbusTCP、DL/T645、BACnetIP、BACnetMS/TP等多种协议转换为ModbusTCP、OPCUA、MQTT、BACnetIP、华为云IoT、亚马逊云IoT、阿里云IoT、ThingsBoard、金鸽云等协议的网关。BL103下行......
  • Netty-TCP 01.编解码
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【1】部分,主要介绍编解码实现。定制协议一般来说,开发TCP通讯应用程序,定制通讯协议是不可避免的,这里以一种最简单的协议为例,假设一个TCP通讯数据包,包含三部分:[type][size][content]type:数据包类型(长度为一个字节,即1个by......
  • Netty-TCP 02.客户端
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【2】部分,主要介绍客户端的实现。模块划分TCP简单TCP通讯(聊天)应用程序客户端主要分为三个部分:心跳保活处理消息消费处理TCP连接实现心跳保活心跳保活是目的是告诉服务端客户端是在线的,当客户端空闲时,定时给服务端发......
  • Netty-TCP 03.服务端
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【3】部分,主要介绍服务端的实现。模块划分跟客户端类似,服务端也是主要分为三个部分:心跳检测处理消息消费处理TCP服务实现心跳检测服务端需要定时检测客户端是否在线(即是否发送心跳),如果没有,那么将客户端连接断开,同样......