如何使用windbg檢視C 某個執行緒的棧大小

2022-10-09 02:33:08 字數 2238 閱讀 3664

每乙個執行緒都有乙個叫teb(thread environment block)的執行緒環境塊資料結構,這個結構中有乙個叫做nt_tib的結構,它裡面有兩個字段分別為stackbasestacklimit,前面叫做棧基址,也就是棧頂,後者叫做棧邊界,因為棧空間是向小位址增長的,所以用stackbase - stacklimit就能算出所謂的棧記憶體大小,接下來我們用 windbg 演示一下。

0:000> ~0s

ntdll!ntwaitforsingleobject+0x14:

00007ffe`28b9fa74 c3              ret

0:000> !teb

teb at 000000b4da0ae000

exceptionlist:        0000000000000000

stackbase:            000000b4d9fa0000

stacklimit:           000000b4d9f98000

subsystemtib:         0000000000000000

fiberdata:            0000000000001e00

arbitraryuserpointer: 0000000000000000

self:                 000000b4da0ae000

environmentpointer:   0000000000000000

clientid:             0000000000000c74 . 00000000000041a4

rpchandle:            0000000000000000

tls storage:          000001f90edad1d0

peb address:          000000b4da0ad000

lasterrorvalue:       0

laststatusvalue:      103

count owned locks:    0

harderrormode:        0

從輸出看兩個值分別為:stackbase=000000b4d9fa0000stacklimit=000000b4d9f98000,那它的大小就是32768byte = 32k

0:000> ? 000000b4d9fa0000 - 000000b4d9f98000

evaluate expression: 32768 = 00000000`00008000

這裡要提醒一下,作業系統的記憶體頁是4k為乙個粒度,也就說所有的輸出結果肯定是4k的倍數,比如當前棧空間就是8個記憶體頁。

剛才用的是快捷命令,接下來我們直接檢視 _teb 結構下的nt_tibstruct 結構變數。

0:000> .thread

implicit thread is now 000000b4`da0ae000

0:000> dt _nt_tib 000000b4`da0ae000

combase!_nt_tib

+0x000 exceptionlist    : (null) 

+0x008 stackbase        : 0x000000b4`d9fa0000 void

+0x010 stacklimit       : 0x000000b4`d9f98000 void

+0x018 subsystemtib     : (null) 

+0x020 fiberdata        : 0x00000000`00001e00 void

+0x020 version          : 0x1e00

+0x028 arbitraryuserpointer : (null) 

+0x030 self             : 0x000000b4`da0ae000 _nt_tib

可以看到,上面的兩個值和!teb顯示的一模一樣。

如何檢視某個埠被誰占用

我們在啟動應用的時候經常發現我們需要使用的埠被別的程式占用,但是我們又不知道是被誰占用,這時候我們需要找出 真兇 如何做到呢?開始 執行 cmd,或者是window r組合鍵,調出命令視窗 輸入命令 netstat ano,列出所有埠的情況。在列表中我們觀察被占用的埠,比如是49157,首先找到它。...

如何檢視某個埠被誰占用

我們在啟動應用的時候經常發現我們需要使用的埠被別的程式占用,但是我們又不知道是被誰占用,這時候我們需要找出 真兇 如何做到呢?開始 執行 cmd,或者是window r組合鍵,調出命令視窗 輸入命令 netstat ano,列出所有埠的情況。在列表中我們觀察被占用的埠,比如是49157,首先找到它。...

如何檢視某個埠被誰占用

開始 執行 cmd,或者是window r組合鍵,調出命令視窗 輸入命令 netstat ano,列出所有埠的情況。在列表中我們觀察被占用的埠,比如是49157,首先找到它。檢視被占用埠對應的pid,輸入命令 netstat aon findstr 49157 回車,記下最後一位數字,即pid,這裡...