日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

windbg 常用查看锁以及互斥量

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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默認為-1,如果>=0,則表示有線程進入到臨界區,要找出有多少線程正在等待進入臨界區,可以:

正在等待的線程數量=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 常用查看锁以及互斥量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。