windbg 常用查看锁以及互斥量
操作系統對死鎖的描述如下:
所謂死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。???
那么為什么會產生死鎖呢?
1.因為系統資源不足。
2.進程運行推進的順序不合適。???
3.資源分配不當。????????????
而產生死鎖的條件有四個:
1.互斥條件:所謂互斥就是進程在某一時間內獨占資源。
2.請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3.不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。
4.循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
!locks?可以查看所有線程占用的鎖信息,包含擁有鎖的線程,以及有多少個線程在等待這把鎖!
ntdll!RtlEnterCriticalSection的第一個參數就代表的互斥量或鎖,可以通過!cs?xxxxxxx?可以看到對應的互斥量信息(包含擁有這個鎖的線程ID以及對應的信號量)
底層的臨界區數據結構為_RTL_CRITICAL_SECTION,所以也可以通過dt命令去查看dt ntdll!_RTL_CRITICAL_SECTION?004030f4,獲取到的信息和!cs?004030f4基本是一致的!
0:006>? dt ntdll!_RTL_CRITICAL_SECTION
?? +0x000 DebugInfo??????? : Ptr64 _RTL_CRITICAL_SECTION_DEBUG
?? +0x008 LockCount??????? : Int4B
?? +0x00c RecursionCount?? : Int4B
?? +0x010 OwningThread???? : Ptr64 Void
?? +0x018 LockSemaphore??? : Ptr64 Void
?? +0x020 SpinCount??????? : Uint8B
正在等待的線程數量=LockCount - RecursionCount + 1。
RecursionCount:表示同一個線程進入到臨界區多少次,默認為0。
OwningThread:如果有線程進入到臨界區,這是進入臨界區的線程ID。
LockSemaphore:這是一個自動重置事件,當線程試圖進入一個其他線程占用的臨界區時,將會創建這個事件。
SpinCount:自旋鎖的次數。
進一步看DebugInfo結構:
0:001> dt _RTL_CRITICAL_SECTION_DEBUG 02.ntdll!_RTL_CRITICAL_SECTION_DEBUG 03. +0x000 Type : Uint2B 04. +0x002 CreatorBackTraceIndex : Uint2B 05. +0x004 CriticalSection : Ptr32 _RTL_CRITICAL_SECTION 06. +0x008 ProcessLocksList : _LIST_ENTRY 07. +0x010 EntryCount : Uint4B 08. +0x014 ContentionCount : Uint4B 09. +0x018 Flags : Uint4B 10. +0x01c CreatorBackTraceIndexHigh : Uint2B 11. +0x01e SpareUSHORT : Uint2B
CriticalSection:在這個域上包含敢一個指針指向與這個結構相關的臨界區。
ProcessLocksList:任何進程在操作系統中都將維護一張鏈表,其中包含了在這個進程中所有處于活躍狀態的臨界區,你可以通過這個節點中FLINK和BLINK來遍歷進程中的臨界區鏈表。
EntryCount:每當線程嘗試進入一個已經被其他線程擁有的臨界區并由此進入到等待狀態,這個域的值都會被加1。
ntdll!NtWaitForSingleObject
NTSTATUS WINAPI NtWaitForSingleObject( _In_ HANDLE Handle, _In_ BOOLEAN Alertable, _In_ PLARGE_INTEGER Timeout );? 第一個參數句柄?可以通過!handle?xxx f去查看詳細的信息??ntdll!__RtlUserThreadStart+0x20?可以查看對應的內存地址
總結
以上是生活随笔為你收集整理的windbg 常用查看锁以及互斥量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: canvas象棋 画图
- 下一篇: python--paramiko模块