国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

這篇具有很好參考價(jià)值的文章主要介紹了記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一:背景

1. 講故事

前幾天有位朋友微信上找到我,說(shuō)他的程序會(huì)偶發(fā)性崩潰,一直找不到原因,讓我?guī)兔匆幌略趺椿厥拢瑢?duì)于這種崩潰類(lèi)的程序,最好的辦法就是丟dump過(guò)來(lái)看一下便知,話不多說(shuō),上windbg說(shuō)話。

二:WinDbg 分析

1. 到底是哪里的崩潰

對(duì)于一個(gè)崩潰類(lèi)的dump,尋找崩潰點(diǎn)非常重要,常用的命令就是 !analyze -v,輸出如下:


0:006> !analyze -v
CONTEXT:  6fbdee65 -- (.cxr 0x6fbdee65)
eax=55d2ebff ebx=5e5f04c0 ecx=e8c434e8 edx=cf8bc35b esi=83008b05 edi=75880000
eip=3d83f98b esp=ce8b0774 ebp=5756ec8b iopl=0 vip     ov up ei pl nz na po nc
cs=4040  ss=0010  ds=81f8  es=00e1  fs=4e8b  gs=ffdb             efl=08758b00
4040:3d83f98b ??              ???
Resetting default scope

EXCEPTION_RECORD:  049bfbd0 -- (.exr 0x49bfbd0)
ExceptionAddress: 00000000
   ExceptionCode: 049bfbf8
  ExceptionFlags: 6f9b6c38
NumberParameters: 8752248
   Parameter[0]: 00000000
   Parameter[1]: 6f9c92a0
   Parameter[2]: 049bfbdc
   Parameter[3]: 00000008
   Parameter[4]: 00000000
   Parameter[5]: 049bfc34
   Parameter[6]: 6f9b6d0d
   Parameter[7]: a2cc713a
   Parameter[8]: 6f9b6c40
   Parameter[9]: 00000000
   Parameter[10]: 00844c80
   Parameter[11]: a2cc712a
   Parameter[12]: 00000000
   Parameter[13]: 049bfd2c
   Parameter[14]: 049bfc00

PROCESS_NAME:  xxxx.exe

ERROR_CODE: (NTSTATUS) 0x80000004 - {    }

EXCEPTION_CODE_STR:  80000004

FAULTING_THREAD:  ffffffff

從卦中的崩潰點(diǎn)來(lái)看,很奇怪,怎么 cs:eip 所處的地址沒(méi)有機(jī)器碼? 先不管了,看下異常狀態(tài) 80000004,在微軟的官方文檔查一查:

記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

從圖中信息看,應(yīng)該是 F11 這種單步跟蹤造成的,這就很奇葩了,分析了200+ 的dump,這種崩潰還是第一次遇到,無(wú)語(yǔ),一下子陷入了迷茫。

2. 還有突破口嗎

雖然 windbg 的自動(dòng)化分析給出的信息很不盡如意,但沒(méi)關(guān)系,根據(jù)強(qiáng)大的臨場(chǎng)經(jīng)驗(yàn),我們直接切到異常前的狀態(tài),看看異常前的上下文有沒(méi)有什么新的線索,刪減后如下:


0:006> .ecxr
eax=00000000 ebx=049bec60 ecx=027e1374 edx=0b8024a8 esi=00000000 edi=049bebf8
eip=09fb48b1 esp=049beb98 ebp=049bebe0 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
xxx!xxx.Program.CurrentDomain_UnhandledException+0x29:
09fb48b1 cc              int     3
0:006> k
  *** Stack trace for last set context - .thread/.cxr resets it
 # ChildEBP RetAddr      
00 049bebe0 6f962546     xxx!xxx.Program.CurrentDomain_UnhandledException+0x29
...
11 049bf114 77a48962     clr!_except_handler4+0x29
12 049bf138 77a48934     ntdll!ExecuteHandler2+0x26
13 049bf200 77a34f86     ntdll!ExecuteHandler+0x24
14 049bf6f0 77a32b2c     ntdll!KiUserExceptionDispatcher+0x26
15 049bf6f0 76698d7a     ntdll!NtClose+0xc
16 049bf6f0 6f96287d     KERNELBASE!CloseHandle+0x4a
...
20 049bf970 78a1887b     clr!SafeHandle::Finalize+0x7a
21 049bf978 78a187e4     mscorlib_ni!System.Runtime.InteropServices.SafeHandle.Dispose+0x1b [f:\dd\ndp\clr\src\BCL\system\runtime\interopservices\safehandle.cs @ 263] 
22 049bf998 6f98df99     mscorlib_ni!System.Runtime.InteropServices.SafeHandle.Finalize+0x24 [f:\dd\ndp\clr\src\BCL\system\runtime\interopservices\safehandle.cs @ 199] 
23 049bf9ec 6f98e0a7     clr!FastCallFinalize+0x6d
24 049bfa10 6f98de5c     clr!MethodTable::CallFinalizer+0x150
25 049bfa78 6f98ded3     clr!CallFinalizer+0xa6
26 049bfa78 6f9c9263     clr!FinalizerThread::DoOneFinalization+0x132
27 049bfaa8 6f9c9343     clr!FinalizerThread::FinalizeAllObjects+0xa1
28 049bfad4 6f973b24     clr!FinalizerThread::FinalizerThreadWorker+0xbe
29 049bfaec 6f973b9b     clr!ManagedThreadBase_DispatchInner+0x71
2a 049bfb74 6f973c4b     clr!ManagedThreadBase_DispatchMiddle+0x8f
2b 049bfbd0 6f9b6c38     clr!ManagedThreadBase_DispatchOuter+0x6d
2c 049bfbf8 6f9b6d0d     clr!ManagedThreadBase::FinalizerBase+0x33
2d 049bfc34 6f98eb34     clr!FinalizerThread::FinalizerThreadStart+0xe2
2e 049bfcd0 76cdfcc9     clr!Thread::intermediateThreadProc+0x58
2f 049bfce0 77a27b1e     kernel32!BaseThreadInitThunk+0x19
30 049bfd3c 77a27aee     ntdll!__RtlUserThreadStart+0x2f
31 049bfd4c 00000000     ntdll!_RtlUserThreadStart+0x1b

從卦中的線程棧信息來(lái)看,邏輯還是非常清楚的,終結(jié)器線程析構(gòu)一個(gè)C#的 SafeWaitHandle 對(duì)象時(shí),在網(wǎng)關(guān)函數(shù) ntdll!NtClose 中拋出了異常,這個(gè)函數(shù)再往下就是 內(nèi)核層 了。

線程既然拋了異常,那 C# 層面有沒(méi)有接到呢?可以用 !t 觀察下。


0:006> !t
ThreadCount:      10
UnstartedThread:  0
BackgroundThread: 8
PendingThread:    0
DeadThread:       1
Hosted Runtime:   no
                                                                         Lock  
       ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   Count Apt Exception
   0    1 4b9c 0085f088     a6028 Preemptive  0B7FF79C:00000000 00858c78 0     STA 
   6    2 5068 008a3708     ab228 Preemptive  0B8024B8:00000000 00858c78 0     MTA (Finalizer) System.Runtime.InteropServices.SEHException 0b800c88
  11    3 293c 0092c0a8   10a9228 Preemptive  00000000:00000000 00858c78 0     MTA (Threadpool Worker) 
  12    4 2eb0 0602ed48   8029228 Preemptive  00000000:00000000 00858c78 0     MTA (Threadpool Completion Port) 
XXXX    5    0 07de70a8   1039820 Preemptive  00000000:00000000 00858c78 0     Ukn (Threadpool Worker) 
  13    6 7e0c 0a7ada58   102a228 Preemptive  00000000:00000000 00858c78 0     MTA (Threadpool Worker) 
  14    7 7c60 0a773950   1029228 Preemptive  00000000:00000000 00858c78 0     MTA (Threadpool Worker) 
  15    8 5c24 0a775f68   10a9228 Preemptive  0B7EB8CC:00000000 00858c78 0     MTA (Threadpool Worker) 
  16    9 698c 008d5b40   1029228 Preemptive  00000000:00000000 00858c78 0     MTA (Threadpool Worker) 
  17   10 7de4 008dea10   1029228 Preemptive  0B7ECE80:00000000 00858c78 0     MTA (Threadpool Worker) 
0:006> !PrintException /d 0b800c88
Exception object: 0b800c88
Exception type:   System.Runtime.InteropServices.SEHException
Message:          外部組件發(fā)生異常。
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    00000000 00000000 mscorlib_ni!Microsoft.Win32.Win32Native.CloseHandle(IntPtr)+0x1
    049BF760 78ADF5FE mscorlib_ni!Microsoft.Win32.SafeHandles.SafeWaitHandle.ReleaseHandle()+0xe
    00000000 00000001 mscorlib_ni!System.Runtime.InteropServices.SafeHandle.InternalFinalize()+0xffffffff90656c91
    049BF978 78A1887B mscorlib_ni!System.Runtime.InteropServices.SafeHandle.Dispose(Boolean)+0x1b
    049BF980 78A187E4 mscorlib_ni!System.Runtime.InteropServices.SafeHandle.Finalize()+0x24

StackTraceString: <none>
HResult: 80004005

從卦中信息看,果然是在析構(gòu) SafeHandle.Finalize 時(shí)異常了,但這個(gè)異常信息 Message:外部組件發(fā)生異常 對(duì)我們來(lái)說(shuō)一點(diǎn)作用都沒(méi)有,到這里貌似又進(jìn)行不下去了。

3. 從 handle 上突破

托管層沒(méi)法挖了,那就繼續(xù)挖非托管層,也就是異常前的最后一個(gè)函數(shù) ntdll!NtClose,這個(gè)函數(shù)其實(shí)沒(méi)什么特別的,也就是釋放句柄,這個(gè)函數(shù)一般來(lái)說(shuō)固若金湯,不會(huì)有異常的,不管怎么說(shuō),先把句柄值找出來(lái)看看,簽名如下:


NTSTATUS NTAPI NtClose(
  HANDLE Handle
);

如何提取出 handle 呢?非常簡(jiǎn)單,用 kb 即可。


0:006> kb 
  *** Stack trace for last set context - .thread/.cxr resets it
 # ChildEBP RetAddr      Args to Child    
...
13 049bf200 77a34f86     049bf218 049bf268 049bf218 ntdll!ExecuteHandler+0x24
14 049bf6f0 77a32b2c     00000664 049bf730 008a3708 ntdll!KiUserExceptionDispatcher+0x26
15 049bf6f0 76698d7a     00000664 049bf6fc 049bf72c ntdll!NtClose+0xc
16 049bf6f0 6f96287d     00000664 049bf730 008a3708 KERNELBASE!CloseHandle+0x4a
...

0:006> !handle 00000664 f
Handle 00000664
  Type         	<Error retrieving type>
unable to query object information
unable to query object information
  No object specific information available

我去,卦中顯示這個(gè) handle=664 句柄值居然不在進(jìn)程中,難怪調(diào)用 ntdll!NtClose 會(huì)報(bào)錯(cuò),接下來(lái)的問(wèn)題就是這個(gè) handle 到底怎么了?要找到這個(gè)答案,需要從線程棧上把 _EXCEPTION_RECORD 結(jié)構(gòu)體給提取出來(lái),它的內(nèi)部記錄了 ExceptionCode ,而且剛好線程棧上的 ntdll!ExecuteHandler 方法的第一個(gè)參數(shù)就是這個(gè)結(jié)構(gòu)體。


0:006> dt _EXCEPTION_RECORD 049bf218
VCRUNTIME140_CLR0400!_EXCEPTION_RECORD
   +0x000 ExceptionCode    : 0xc0000008
   +0x004 ExceptionFlags   : 0
   +0x008 ExceptionRecord  : (null) 
   +0x00c ExceptionAddress : 0x74a70daa Void
   +0x010 NumberParameters : 0
   +0x014 ExceptionInformation : [15] 0

接下來(lái)就是找下 ExceptionCode=0xc0000008 代表什么意思,這個(gè)簡(jiǎn)單,網(wǎng)上搜一下便知,截圖如下:

記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

到這里就很好理解了,然來(lái)是在釋放一個(gè)已經(jīng)釋放的句柄,這個(gè)肯定會(huì)報(bào)錯(cuò)的,據(jù)朋友所說(shuō),他們的程序是 C# 和 C++ 混合編程的,那大概率就是 handle=664 被 C++ 給提前釋放了。

有些朋友肯定要問(wèn)了,那我怎么找到釋放這個(gè) handle 的代碼呢?要尋找這個(gè)答案,需要通過(guò) perfview 對(duì) handle 進(jìn)行全程監(jiān)控,參見(jiàn):https://www.cnblogs.com/huangxincheng/p/17559370.html

三:總結(jié)

這個(gè)崩潰還是挺有意思的,需要你對(duì) Windows 層面的知識(shí)有一定的了解,否則很難找出前因后果,所以請(qǐng)善待做大工控的朋友。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711548.html

記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

到了這里,關(guān)于記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 記一次 .NET 某工控電池檢測(cè)系統(tǒng) 卡死分析

    記一次 .NET 某工控電池檢測(cè)系統(tǒng) 卡死分析

    前幾天有位朋友找到我,說(shuō)他的窗體程序有卡死現(xiàn)象,讓我?guī)兔聪略趺椿厥?,解決這種問(wèn)題就需要在卡死的時(shí)候抓一個(gè)dump下來(lái),拿到dump之后就可以分析了。 窗體程序的卡死,需要觀察主線程此時(shí)正在做什么,可以用 !clrstack 命令觀察。 從卦中的線程棧數(shù)據(jù)來(lái)看,貌似是卡

    2024年02月05日
    瀏覽(28)
  • 記一次 .NET某管理局檢測(cè)系統(tǒng) 內(nèi)存暴漲分析

    記一次 .NET某管理局檢測(cè)系統(tǒng) 內(nèi)存暴漲分析

    前些天有位朋友微信找到我,說(shuō)他們的WPF程序有內(nèi)存泄漏的情況,讓我?guī)兔聪略趺椿厥??并且dump也抓到了,網(wǎng)上關(guān)于程序內(nèi)存泄漏,內(nèi)存暴漲的文章不計(jì)其數(shù),看樣子這個(gè)dump不是很好分析,不管怎么說(shuō),上 windbg 說(shuō)話。 在 .NET調(diào)試訓(xùn)練營(yíng) 中我一直強(qiáng)調(diào)要相信數(shù)據(jù),不要相

    2024年04月08日
    瀏覽(29)
  • 新能源汽車(chē)電控系統(tǒng)

    新能源汽車(chē)電控系統(tǒng)

    新能源汽車(chē)電控系統(tǒng)主要分為:三電系統(tǒng)電控系統(tǒng)、高壓系統(tǒng)電控系統(tǒng)、低壓系統(tǒng)電控系統(tǒng) 包括整車(chē)控制器、電池管理系統(tǒng)、驅(qū)動(dòng)電機(jī)控制器等。 整車(chē)控制器VCU 整車(chē)控制器作為電動(dòng)汽車(chē)中央控制單元,是整個(gè)控制系統(tǒng)的核心,也是各個(gè)子系統(tǒng)的調(diào)控中心。 VCU 集成駕駛員意

    2024年02月12日
    瀏覽(19)
  • 談?wù)勑履茉醇夹g(shù)

    談?wù)勑履茉醇夹g(shù)

    目錄 1.什么是新能源 2.新能源的發(fā)展歷程 3.新能源的優(yōu)勢(shì) ????????新能源是指利用自然界可再生資源、無(wú)害的高效能資源或者核能等來(lái)替代傳統(tǒng)能源的能源形式。與傳統(tǒng)化石燃料相比,新能源具有更高的可持續(xù)性、更低的環(huán)境影響和更長(zhǎng)久的供應(yīng)。以下是一些常見(jiàn)的新能

    2024年02月14日
    瀏覽(25)
  • 新能源汽車(chē)的發(fā)展

    新能源汽車(chē)的發(fā)展

    目錄 1.什么是新能源 2.什么是新能源汽車(chē) 3.新能源汽車(chē)的優(yōu)點(diǎn) 4.新能源汽車(chē)的危害 5.新能源汽車(chē)未來(lái)的發(fā)展 ????????新能源是指與傳統(tǒng)能源(如化石燃料)相比,更具可再生性、清潔性和低碳排放的能源形式。它主要通過(guò)利用自然資源和可再生能源來(lái)滿足人類(lèi)的能源需求

    2024年02月15日
    瀏覽(25)
  • 【筆記】關(guān)于新能源

    新能源發(fā)電的間歇性和不確定性主要指: 間歇性(Intermittency) : 新能源如太陽(yáng)能和風(fēng)能等,其發(fā)電量受到自然條件的直接影響。例如,太陽(yáng)能發(fā)電依賴(lài)于日照強(qiáng)度,而風(fēng)能發(fā)電則取決于風(fēng)速大小。這些自然資源在時(shí)間和空間上都有顯著的不連續(xù)和變化特性。白天和黑夜、季

    2024年01月19日
    瀏覽(29)
  • 開(kāi)發(fā)新能源的好處

    開(kāi)發(fā)新能源的好處

    風(fēng)能無(wú)論是總 裝機(jī)容量 還是新增裝機(jī)容量,全球都保持著較快的發(fā)展速度,風(fēng)能將迎來(lái)發(fā)展高峰。風(fēng)電上網(wǎng)電價(jià)高于火電,期待價(jià)格理順促進(jìn)發(fā)展。 生物質(zhì)能有望在農(nóng)業(yè)資源豐富的熱帶和亞熱帶普及,主要問(wèn)題是降低 制造成本 ,生物乙醇、生物柴油以及 二甲醚 燃料應(yīng)用值

    2024年02月11日
    瀏覽(19)
  • 思格新能源面試(部分)

    面試官聊到他們是做儲(chǔ)能的,是從華為數(shù)字能源獨(dú)立出來(lái)的。他們主要缺算法的人。他們調(diào)用了ChatGPT的接口,但一是比較慢,二是回答質(zhì)量不太滿意。 你了解一些大數(shù)據(jù)技術(shù)嗎,你們公司用到哪些? 有沒(méi)有一些實(shí)時(shí)的流式計(jì)算的場(chǎng)景?Answer by newBing : 大數(shù)據(jù)技術(shù)中的實(shí)時(shí)流式

    2024年02月15日
    瀏覽(20)
  • 新能源科學(xué)與工程專(zhuān)業(yè)概述

    新能源科學(xué)與工程專(zhuān)業(yè)概述

    英文名稱(chēng):New Energy Science and Engineering 新能源科學(xué)與工程 該專(zhuān)業(yè)為2011年新增專(zhuān)業(yè),主要學(xué)習(xí)新能源的種類(lèi)和特點(diǎn)、利用的方式和方法、應(yīng)用的現(xiàn)狀和未來(lái)的發(fā)展趨勢(shì)。具體內(nèi)容涉及太陽(yáng)能、風(fēng)能、生物質(zhì)能、核電能、化石能源等等。 近年來(lái)我國(guó)經(jīng)濟(jì)持續(xù)高速增長(zhǎng),傳統(tǒng)能源

    2024年02月03日
    瀏覽(20)
  • 緊跟國(guó)家“新能源+”模式!涂鴉智慧能源方案助力夏季用電節(jié)能提效

    緊跟國(guó)家“新能源+”模式!涂鴉智慧能源方案助力夏季用電節(jié)能提效

    “今天的你是幾分熟?” 今年夏天,高溫來(lái)得比往年更早,五六月份就提前開(kāi)啟了滾滾熱浪模式,京津冀和山東等地最高氣溫也一度突破了歷史極值。在提前到來(lái)的高溫“烤”驗(yàn)下,全社會(huì)供電能力面臨著極大挑戰(zhàn)。 中國(guó)電力網(wǎng)預(yù)計(jì),2023 年全國(guó)用電量將同比增長(zhǎng) 6% 至 8%。

    2024年02月16日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包