如何使用windbg查看C#某个线程的栈大小 ?
每一個線程都有一個叫 TEB(Thread Environment Block) 的線程環(huán)境塊數(shù)據(jù)結(jié)構(gòu),這個結(jié)構(gòu)中有一個叫做 NT_TIB 的結(jié)構(gòu),它里面有兩個字段分別為 StackBase 和 StackLimit,前面叫做棧基址,也就是棧頂,后者叫做 棧邊界 ,因為棧空間是向小地址增長的,所以用 StackBase - StackLimit 就能算出所謂的棧內(nèi)存大小,接下來我們用 windbg 演示一下。
一:windbg 演示
1. 使用 !teb 命令
大家可以用 windbg 直接調(diào)試你的程序,我手里剛好有一個 dump 文件,這里就從主線程看起吧。
0:000>?~0s ntdll!NtWaitForSingleObject+0x14: 00007ffe`28b9fa74?c3??????????????ret 0:000>?!teb TEB?at?000000b4da0ae000ExceptionList:????????0000000000000000StackBase:????????????000000b4d9fa0000StackLimit:???????????000000b4d9f98000SubSystemTib:?????????0000000000000000FiberData:????????????0000000000001e00ArbitraryUserPointer:?0000000000000000Self:?????????????????000000b4da0ae000EnvironmentPointer:???0000000000000000ClientId:?????????????0000000000000c74?.?00000000000041a4RpcHandle:????????????0000000000000000Tls?Storage:??????????000001f90edad1d0PEB?Address:??????????000000b4da0ad000LastErrorValue:???????0LastStatusValue:??????103Count?Owned?Locks:????0HardErrorMode:????????0從輸出看兩個值分別為:StackBase=000000b4d9fa0000 和 StackLimit=000000b4d9f98000,那它的大小就是 32768byte = 32k。
0:000>???000000b4d9fa0000?-?000000b4d9f98000 Evaluate?expression:?32768?=?00000000`00008000這里要提醒一下,操作系統(tǒng)的內(nèi)存頁是 4k 為一個粒度,也就說所有的輸出結(jié)果肯定是4k的倍數(shù),比如當(dāng)前棧空間就是 8 個內(nèi)存頁。
2. 查看 NT_TIB 結(jié)構(gòu)
剛才用的是快捷命令,接下來我們直接查看 _TEB 結(jié)構(gòu)下的 NT_TIB struct 結(jié)構(gòu)變量。
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 顯示的一模一樣。
總結(jié)
以上是生活随笔為你收集整理的如何使用windbg查看C#某个线程的栈大小 ?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 基础控件之 DataGrid 样
- 下一篇: .NET Core 返回结果统一封装