广州市专业网站设计,深圳建设厅网站,电商网站设计页面设计,网站 空间转移每一个线程都有一个叫 TEB#xff08;Thread Environment Block#xff09; 的线程环境块数据结构#xff0c;这个结构中有一个叫做 NT_TIB 的结构#xff0c;它里面有两个字段分别为 StackBase 和 StackLimit#xff0c;前面叫做栈基址,也就是栈顶#xff0c;后者叫做 栈… 每一个线程都有一个叫 TEBThread Environment Block 的线程环境块数据结构这个结构中有一个叫做 NT_TIB 的结构它里面有两个字段分别为 StackBase 和 StackLimit前面叫做栈基址,也就是栈顶后者叫做 栈边界 因为栈空间是向小地址增长的所以用 StackBase - StackLimit 就能算出所谓的栈内存大小接下来我们用 windbg 演示一下。一windbg 演示 1. 使用 !teb 命令大家可以用 windbg 直接调试你的程序我手里刚好有一个 dump 文件这里就从主线程看起吧。0:000 ~0s
ntdll!NtWaitForSingleObject0x14:
00007ffe28b9fa74 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从输出看两个值分别为StackBase000000b4d9fa0000 和 StackLimit000000b4d9f98000那它的大小就是 32768byte 32k。0:000 ? 000000b4d9fa0000 - 000000b4d9f98000
Evaluate expression: 32768 0000000000008000这里要提醒一下操作系统的内存页是 4k 为一个粒度也就说所有的输出结果肯定是4k的倍数比如当前栈空间就是 8 个内存页。2. 查看 NT_TIB 结构 刚才用的是快捷命令接下来我们直接查看 _TEB 结构下的 NT_TIB struct 结构变量。0:000 .thread
Implicit thread is now 000000b4da0ae000
0:000 dt _NT_TIB 000000b4da0ae000
combase!_NT_TIB0x000 ExceptionList : (null) 0x008 StackBase : 0x000000b4d9fa0000 Void0x010 StackLimit : 0x000000b4d9f98000 Void0x018 SubSystemTib : (null) 0x020 FiberData : 0x0000000000001e00 Void0x020 Version : 0x1e000x028 ArbitraryUserPointer : (null) 0x030 Self : 0x000000b4da0ae000 _NT_TIB可以看到上面的两个值和 !teb 显示的一模一样。