記一次 .NET 某埋線管理系統(tǒng) 崩潰分析
一:背景
1. 講故事
經(jīng)常有朋友跟我反饋,說(shuō)看你的文章就像看天書一樣,有沒有一些簡(jiǎn)單入手的dump 讓我們先找找感覺,哈哈,今天就給大家?guī)?lái)一篇入門級(jí)的案例,這里的入門是從 WinDbg 的角度來(lái)闡述的,這個(gè)問題如果你通過 記日志,分析代碼 的方式,可能真的無(wú)法解決,不信的話繼續(xù)往下看唄!
前段時(shí)間有位朋友微信上找到我,說(shuō)他的程序崩潰了,也沒找出是什么原因,然后就讓朋友抓一個(gè)崩潰的dump讓我看看。
二:WinDbg 分析
1. 崩潰原因在哪里
在 windbg 中有一個(gè)自動(dòng)化的分析命令 !analyze -v 可以尋找到 miniDumpWriteDump 時(shí)塞入的 PMINIDUMP_EXCEPTION_INFORMATION 信息,結(jié)構(gòu)如下:
typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
DWORD ThreadId;
PEXCEPTION_POINTERS ExceptionPointers;
BOOL ClientPointers;
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;這個(gè)命令執(zhí)行時(shí)間可能很長(zhǎng),要稍等片刻
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上面的崩潰點(diǎn)的匯編語(yǔ)句 mov rcx,qword ptr [rax] 說(shuō)的非常清楚,訪問0區(qū)的 0000000000000198 地址必然會(huì)是訪問違例,接下來(lái)簡(jiǎn)單看一下匯編代碼。
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)從匯編代碼看是一段 數(shù)組操作 的邏輯,捋匯編太累了,我們看下 igxelpicd64.dll 模塊到底是誰(shuí)寫的,用 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 來(lái)看原來(lái)是用來(lái)渲染 2D,3D 矢量圖形的工具包哈,這東西太底層了,沒玩過,不過有一點(diǎn)可以肯定的是這個(gè) dll 是屬于 Intel 的,那為什么會(huì)調(diào)用這個(gè)渲染功能呢?這就需要觀察線程棧了。
2. 誰(shuí)在調(diào)用渲染
崩潰有兩個(gè)場(chǎng)景,一個(gè)是崩潰前,一個(gè)是崩潰后,要看崩潰前的線程棧我們一定要知道崩潰前的狀況,這里用 .ecxr 命令切換,簡(jiǎn)化后如下:
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
...從線程??词怯脩酎c(diǎn)擊了鼠標(biāo),進(jìn)入了 GSGlobeDotNet.dll ,在讀取像素的底層邏輯中拋了異常,然后到網(wǎng)上搜了一下,原來(lái)是繪制三維地球的工具包,這個(gè)??了。
圖片
知道這些信息后,讓朋友升級(jí)下 顯卡驅(qū)動(dòng) 試試,后來(lái)朋友改了顯卡的設(shè)置就搞定了,截圖如下:
圖片
三:總結(jié)
顯卡的問題也能導(dǎo)致程序的崩潰,太不可思議了,試想一下你如果只是記日志,看代碼,怎么可能找的出問題,哈哈哈,這就是高級(jí)調(diào)試的價(jià)值。





































