.NET高级调试 - 3.8线程操作
简介
高级调试过程中,与线程与线程栈是打交道特别多的。因此如何查看线程与线程栈就显得至关重要了
查看线程
!Threads
使用 !t/!Threads 命令获取所有托管线程

| 含义 | |
|---|---|
| ThreadCount | 线程数量 |
| UnstartedThread | 线程创建,但未开始的 |
| BackgroundThread | 后台线程数量 |
| PendingThread | 阻塞的线程数量 |
| DeadThread | 线程已经执行完,到被线程池回收的这个过程。线程被称为Dead Thread。此时OSId会被销毁 |
| 列名 | 详细说明 |
|---|---|
| null | windbg自定义的线程Id,包含了托管线程和非托管线程。我们可以看到,0之后紧接着就是5.说明有4个非托管线程被创建 |
| Id | 托管线程Id,就是CurrentManagedThreadId |
| OSId | 操作系统的Id,CLR团队曾经想将托管线程Id与OSId 设为多对一的关系。并未成功。现在是一对一的关系 |
| ThreadOBJ | CLR层面的Thread信息,可以用dp观察其中的内容 |
| State | CLR层面的线程状态 |
| GC Mode | CLR当前的线程状态,是抢占模式还是协作模式,主要是判断是否有操控托管堆的权限 |
| GC Alloc Context | GC会在这个上下文区间内分配对象,类似于缓冲区 |
| Domain | 当前线程所属的应用程序域,默认情况为Domain1 |
| Lock Count | 当前线程持有的托管锁个数 |
| Apt | 当前COM套件模式,分为STA与MTA |
| Exception | 当前线程的异常信息,如果抛出异常并未处理的话 |
Threads命令包含了一组开关如下
- !t -live

只输出处于活跃状态的线程的信息
2. !t -special
额外输出所有“特殊”线程,如垃圾回收线程,线程池线程

查看非托管调用栈
k
WinDbg是非托管调试器,自带的命令k只能查看非托管调用栈。因此看不到托管部分。
会输出如下警告信息:
WARNING:Frame IP not in any known module. Following frames may be wrong.

我并没有复现,可能是版本的windbg有调整。但是红圈部分也表示了。这一段代码并没有pdb文件,所以只显示一个Entry_point
查看托管调用栈
!ClrStack
因此要查看托管代码的调用栈,要使用SOS拓展的ClrStack命令。

ClrStack命令显示了托管调用栈的所有栈帧,并有如下几个开关
!Clrstack -l
相当于local,用于显示局部变量信息!Clrstack -p
相当于parameters将显示调用栈上每个托管代码帧的所有参数!Clrstack -a
相当于all,把当前线程上的局部变量和参数全部显示出来

Clrstack命令如果在非托管代码线程上运行,会显示一个错误信息
!dso

有时候我们会发现有很多变量是no data. 尤其是64位程序。
我们可以辅助使用!dso命令来显示出线程调用栈的所有对象

同时查看托管/非托管调用栈
!DumpStack
Clrstack命令只输出托管代码调用栈,k命令只出书非托管调用栈。要同时输出,可以使用dumpstack命令。

使用-EE开关还表示只显示托管函数,这与ClrStack一模一样。只是多显示了方法描述符指针

可能并没有你想象的这么好用,因为输出的信息太多了。反而不利于判断。
遍历所有线程的调用栈
!EEStack
有时候,我们需要获得进程中所有托管线程的调用栈,不想重复使用0s,1s来切换线程。
我们可以使用EEStack命令,来遍历所有托管线程的调用栈,非托管线程不遍历

!EEStack -short
这个开关只输出"感兴趣"的调用栈,比如当前线程持有一个锁,线程被劫持以执行一个垃圾收集操作,线程正在执行。!EEStack -EE
直接传递给DumpStack命令,并只显示托管代码调用栈
~*e xxx
e代表在指定线程后 追加一个指令。
比如 ~*e !clrstack 代表遍历所有托管线程的调用栈

~*e k 代表遍历所有非托管线程的调用栈

总结

.NET高级调试 - 3.8线程操作的更多相关文章
- Linux高级调试与优化——gdb调试命令
番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...
- (九) 一起学 Unix 环境高级编程 (APUE) 之 线程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- [Android Studio 权威教程]断点调试和高级调试
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...
- ###Android 断点调试和高级调试###
转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...
- 8)Linux程序设计入门--线程操作
)Linux程序设计入门--线程操作 前言:Linux下线程的创建 介绍在Linux下线程的创建和基本的使用. Linux下的线程是一个非常复杂的问题,由 于我对线程的学习不时很好,我在这里只是简单的 ...
- Android Stuido中断点调试和高级调试
写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...
- .NET高级调试系列-Windbg调试入门篇
Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...
- winform 跨线程操作控件
当进行winform的开发时,经常遇到用时比较久的操作,在传统的单线程程序中,用户必须等待这个耗时操作完成以后才能进行下一步的操作,这个时候,多线程编程就派上用场了,将这个耗时的操作放到一个新的子线程 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
随机推荐
- nvme硬盘的断电保护是否有用,是噱头、智商税还是真的有需要?购买DOCKCASE智能M2固态硬盘盒10秒保护
最近在某东上买了一个10秒断电保护的nvme硬盘,其实对于这个断电保护有用没有用我是不懂的,也是不care的,买这个硬盘盒主要就是为了这个屏幕去的,不过东西到手后我就开始思考这个断电保护到底有用没有用 ...
- 代码随想录Day8
344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 \(O(1)\) 的额外空间解决 ...
- 一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较
引言 近年来,"Ops"一词在 IT 运维领域的使用迅速增加.IT 运维正在向自动化过程转变,以改善客户交付.传统的应用程序开发采用 DevOps 实施持续集成(CI)和持续部署( ...
- Java类和对象 小白版
一.类 一.类的定义 具有同种属性的对象称为类.定义了它所包含的全体对象的公共特征和功能,对象就是类的一个实例化. 类的三种常见成员:属性.方法.构造器 二.类的编写 1.类名的定义: 2.类属性(特 ...
- React 高德地图 进京证 路线规划 问题小记
一.加载问题 用高德地图做了个进京证路线规划的功能,官网也是有 React 代码示例.但是吧,这个Demo有问题,地图是能加载成功,但是其他功能再用 map 这个变量肯定不行,果不其然是null,处理 ...
- 2023 CCPC 女生题解
gym B. 终焉之茧 \(\star\) 显然两个维度分别做 单谷函数,起始点 \(A\) 是一个端点.一个 naive 的想法是三分目标点 \(B\),但交互次数会超.二分关于 \(B\) 对称点 ...
- 处理报错 ResizeObserver loop completed with undelivered notifications.
// 处理报错 ResizeObserver loop completed with undelivered notifications. export const handlerResizeObse ...
- zabbix4.0配置短信报警
1.准备工作 #访问短信网址:172.16.98.1,网线插LAN口 #账号&密码:admin 安装ubuntu系统模拟http请求工具(命令行模式) # apt-get install ht ...
- PCIe简介
PCIe简介 Peripheral Component Interconnect Express (PCI),高速串行计算机扩展总线标准,PCIe对外围设备的组织方式是树形结构. 拓扑结构 根: 树的 ...
- GNU make-Makefile文件简介
Makefile简介 Makefile是一种特殊格式的文件,被make工具使用来管理软件的构建过程.Makefile定义了一组规则和依赖关系,告诉make如何编译和链接程序. Makefile语句 T ...
