当前位置:网站首页>如何使用windbg查看C#某个线程的栈大小 ?
如何使用windbg查看C#某个线程的栈大小 ?
2022-08-02 20:02:00 【biyusr】
每一个线程都有一个叫 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 显示的一模一样。
边栏推荐
- unittest自动化测试框架总结
- Three.js入门
- J9 Digital Currency Theory: Identifying Web3's New Scarcity: Open Source Developers
- 成为黑客不得不学的语言,看完觉得你们还可吗?
- 【手撕AHB-APB Bridge】~ AMBA总线 之 APB
- OP-5,输入/输出信号范围-一信号处理能力
- 第七章 噪声
- 扫码预约 | 观看Apache Linkis数据处理实践以及计算治理能力
- 9,共模抑制比一-不受输入信号中共模波动的影响。【如何分析共模CM抑制比。】
- ShardingSphere-proxy +PostgreSQL implements read-write separation (static strategy)
猜你喜欢

Three.js入门

Caldera(一)配置完成的虚拟机镜像及admin身份简单使用

"A daily practice, happy water problem" 1374. Generate a string with an odd number of each character

特拉维夫大学 | Efficient Long-Text Understanding with Short-Text Models(使用短文本模型进行高效的长文本理解)

ssdp协议搜索GB28181设备

一款好用的FAQ搭建工具

SQL Server实现group_concat功能

「面试必会」这应该是最有深度的TCP三次握手、四次挥手细节讲解

成为黑客不得不学的语言,看完觉得你们还可吗?

ECCV 2022 | 通往数据高效的Transformer目标检测器
随机推荐
es 读流程源码解析
Fiddle设置接口数据用指定工具查看;Sublime Text设置json数据格式化转换
基于 flex 布局实现的三栏布局
Leetcode刷题——23. 合并K个升序链表
六石管理学:入门机会只有一次,先把产品做好
Redis集群配置
分布式事务
ShardingSphere-proxy +PostgreSQL implements read-write separation (static strategy)
TPAMI2022 | TransCL:基于Transformer的压缩学习,更灵活更强大
【StoneDB性能相关工具】内存监控
软件测试分类
训练双塔检索模型,可以不用query-doc样本了?明星机构联合发文
「 每日一练,快乐水题 」1374. 生成每种字符都是奇数个的字符串
技术分享 | Apache Linkis 快速集成网页IDE工具 Scriptis
ShardingSphere-proxy +PostgreSQL实现读写分离(静态策略)
ALV概念讲解
成为黑客不得不学的语言,看完觉得你们还可吗?
KDD 2022 | 深度图神经网络中的特征过相关:一个新视角
golang 源码分析:uber-go/ratelimit
AI Scientist: Automatically discover hidden state variables of physical systems