当前位置:网站首页>如何使用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
显示的一模一样。
边栏推荐
- 你是几星测试/开发程序员?技术型选手王大拿......
- 新增指令 v-memo
- 一次线上事故,我顿悟了异步的精髓
- Flutter with internationalized adapter automatically generated
- AI Scientist: Automatically discover hidden state variables of physical systems
- Implement fashion_minst clothing image classification
- Silver circ: letter with material life insurance products should be by the insurance company is responsible for the management
- 实现fashion_minst服装图像分类
- Golang source code analysis: time/rate
- Leetcode刷题——单调栈问题(739每日温度问题、496下一个更大元素I、503下一个更大元素 II)
猜你喜欢
【手撕AHB-APB Bridge】~ AMBA总线 之 APB
el-tree渲染大量数据的解决方案(不通过懒加载)
谷歌竞价机器学习如何去理解?
AI科学家:自动发现物理系统的隐藏状态变量
Electron User Guide Beginning Experience
Leetcode刷题——字符串相加相关题目(415. 字符串相加、面试题 02.05. 链表求和、2. 两数相加)
Office2021 安装MathType
Translate My Wonderful | July Moli Translation Program Winners Announced
广东省数字经济发展指引 1.0之建成数据安全保障体系
扫码预约 | 观看Apache Linkis数据处理实践以及计算治理能力
随机推荐
网络协议介绍
Shell: conditional statements
APP自动化uiautomator2获取toast
程序员也许都缺一个“二舅”精神
Flutter with internationalized adapter automatically generated
Solve the docker mysql can't write Chinese
setup语法糖 defineProps defineEmits defineExpose
谷歌竞价机器学习如何去理解?
训练双塔检索模型,可以不用query-doc样本了?明星机构联合发文
太魔人招新啦|快来加入我们吧!
AI科学家:自动发现物理系统的隐藏状态变量
Redis 5 种数据结构及对应使用场景
软件测试分类
js Fetch返回数据res.json()报错问题
【软件工程导论】软件工程导论笔记
OpenCV开发中的内存管理问题
Geoip2 - golang golang source code analysis
2170. 使数组变成交替数组的最少操作数
【SLAM】DM-VIO(ros版)安装和论文解读
六石管理学:入门机会只有一次,先把产品做好