我们一起聊聊如何使用Windbg查看C#某个线程的栈大小 ?

开发 前端
每一个线程都有一个叫 TEB(Thread Environment Block) 的线程环境块数据结构,这个结构中有一个叫做 NT_TIB 的结构,它里面有两个字段分别为 StackBase 和 StackLimit,前面叫做栈基址,也就是栈顶,后者叫做 栈边界 。

每一个线程都有一个叫 TEB(Thread Environment Block) 的线程环境块数据结构,这个结构中有一个叫做 NT_TIB 的结构,它里面有两个字段分别为 StackBase 和 StackLimit,前面叫做栈基址,也就是栈顶,后者叫做 栈边界 ,因为栈空间是向小地址增长的,所以用 StackBase - StackLimit 就能算出所谓的栈内存大小,接下来我们用 windbg 演示一下。

一:windbg 演示

1. 使用 !teb 命令

大家可以用 windbg 直接调试你的程序,我手里刚好有一个 dump 文件,这里就从主线程看起吧。

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=000000b4d9fa0000 和 StackLimit=000000b4d9f98000,那它的大小就是 32768byte = 32k。

0:000> ? 000000b4d9fa0000 - 000000b4d9f98000
Evaluate expression: 32768 = 00000000`00008000

这里要提醒一下,操作系统的内存页是 4k 为一个粒度,也就说所有的输出结果肯定是4k的倍数,比如当前栈空间就是 8 个内存页。

2. 查看 NT_TIB 结构

刚才用的是快捷命令,接下来我们直接查看 _TEB 结构下的 NT_TIB struct 结构变量。

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 显示的一模一样。

责任编辑:武晓燕 来源: 一线码农聊技术
相关推荐

2024-11-28 09:57:50

C#事件发布器

2023-10-10 08:00:07

2023-12-28 09:55:08

队列数据结构存储

2024-05-29 13:18:12

线程Thread​方式

2024-08-26 08:34:47

AES加密算法

2022-09-07 07:27:36

函数元素

2024-12-10 00:00:25

2023-07-11 08:34:25

参数流程类型

2024-08-30 11:00:22

2023-10-31 09:04:21

CPU调度Java

2022-10-08 00:00:05

SQL机制结构

2023-08-10 08:28:46

网络编程通信

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

数据安全API

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷开发模式

2023-04-26 07:30:00

promptUI非结构化

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循环GolangGo

2024-11-27 16:07:45

点赞
收藏

51CTO技术栈公众号