• 如何使用windbg查看C#某个线程的栈大小 ?


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

    一:windbg 演示

    1. 使用 !teb 命令

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

    1. 0:000> ~0s
    2. ntdll!NtWaitForSingleObject+0x14:
    3. 00007ffe`28b9fa74 c3              ret
    4. 0:000> !teb
    5. TEB at 000000b4da0ae000
    6.     ExceptionList:        0000000000000000
    7.     StackBase:            000000b4d9fa0000
    8.     StackLimit:           000000b4d9f98000
    9.     SubSystemTib:         0000000000000000
    10.     FiberData:            0000000000001e00
    11.     ArbitraryUserPointer: 0000000000000000
    12.     Self:                 000000b4da0ae000
    13.     EnvironmentPointer:   0000000000000000
    14.     ClientId:             0000000000000c74 . 00000000000041a4
    15.     RpcHandle:            0000000000000000
    16.     Tls Storage:          000001f90edad1d0
    17.     PEB Address:          000000b4da0ad000
    18.     LastErrorValue:       0
    19.     LastStatusValue:      103
    20.     Count Owned Locks:    0
    21.     HardErrorMode:        0

    从输出看两个值分别为:StackBase=000000b4d9fa0000 和 StackLimit=000000b4d9f98000,那它的大小就是 32768byte = 32k

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

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

    2. 查看 NT_TIB 结构

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

    1. 0:000> .thread
    2. Implicit thread is now 000000b4`da0ae000
    3. 0:000> dt _NT_TIB 000000b4`da0ae000
    4. combase!_NT_TIB
    5.    +0x000 ExceptionList    : (null
    6.    +0x008 StackBase        : 0x000000b4`d9fa0000 Void
    7.    +0x010 StackLimit       : 0x000000b4`d9f98000 Void
    8.    +0x018 SubSystemTib     : (null
    9.    +0x020 FiberData        : 0x00000000`00001e00 Void
    10.    +0x020 Version          : 0x1e00
    11.    +0x028 ArbitraryUserPointer : (null
    12.    +0x030 Self             : 0x000000b4`da0ae000 _NT_TIB

    可以看到,上面的两个值和 !teb 显示的一模一样。

  • 相关阅读:
    应对广告虚假流量,app广告变现该如何风控?
    MySQL-数据库的设计范式
    黑龙江科技大学计算机考研资料汇总
    易基因|深度综述:m6A RNA甲基化在大脑发育和疾病中的表观转录调控作用
    在若依Ruoyi-Vue中集成mybatisplus实现mybatis增强
    Kotlin内置函数let、run、apply的区别
    特征选择-sklearn
    Virtualbox固定存储硬盘转换为动态存储硬盘
    SpringSecurity:通过OAuth2集成Github
    【华为OD机试真题 python】 字符串比较【2022 Q4 | 200分】
  • 原文地址:https://blog.csdn.net/biyusr/article/details/126049684