如何获取 C#程序 内核态线程栈

一:背景

1. 讲故事

在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的dump,这里我们简单汇总下。

二:如何生成内核态dump

1. 案例代码

为了方便演示,来一段简单的测试代码,目的就是观察 Console.ReadLine 方法的内核态栈。

internal class Program{static void Main(string[] args){Console.WriteLine("hello world!");Console.ReadLine();}}

通过 任务管理器 或者 Process Explorer 默认抓取的dump都是 ntdll 之上的空间,可以用 k 来看一下。


0:000> k 3# Child-SP          RetAddr               Call Site
00 000000d6`7c9fe328 00007ffe`61405593     ntdll!NtReadFile+0x14
01 000000d6`7c9fe330 00007ffd`50724782     KERNELBASE!ReadFile+0x73
02 000000d6`7c9fe3b0 00007ffe`215bc742     0x00007ffd`50724782

问题来了,如果我要看下 ntdll!NtReadFile 函数对应在内核态中的 nt!NtReadFile 方法怎么办呢?只能抓内核态dump,抓内核态dump的方式有很多,这里聊一下其中的两种方式。

2. 使用 notmyfault 抓取

说到 蓝屏 我相信有很多朋友都知道,简而言之就是内核态代码出bug导致系统崩溃,也有朋友知道通过增加一些配置可以在蓝屏的时候自动生成 dump 文件,这种 dump 文件就属于内核态,配置如下:

但这里有一个问题,操作系统不可能无缘无故的蓝屏,那怎么办呢?微软想了一个办法,人为的造蓝屏,所以提供了一个叫 notmyfault.exe 的工具, MSDN网址:https://learn.microsoft.com/en-us/sysinternals/downloads/notmyfault

有了这些前置基础,接下来就可以操练一下,双击 notmyfault.exe 工具,崩溃原因选择默认的 High IRQL fault,最后点击 Crash 按钮,稍等片刻电脑就会蓝屏。截图如下:

我这里用的是一台物理的 迷你主机 测试,再次远程连接后,在 C:\Windows 下会生成一个 MEMORY.dmp 文件,截图如下:

拿到 dump 之后就可以用 windbg 中的 !process 之类的命令分析了,非常爽。


1: kd>  !process 0 2 ConsoleApp1.exe
PROCESS ffffdb05c1641080SessionId: 1  Cid: 1bc8    Peb: fd877dd000  ParentCid: 15ecDirBase: 1b9ef3000  ObjectTable: ffffa105fc3d5280  HandleCount: 161.Image: ConsoleApp1.exeTHREAD ffffdb05bf3c7080  Cid 1bc8.0924  Teb: 000000fd877de000 Win32Thread: ffffdb05c00d0ad0 WAIT: (Executive) KernelMode Alertableffffdb05c1902ef8  NotificationEventTHREAD ffffdb05c0fc6080  Cid 1bc8.07c8  Teb: 000000fd877e4000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertableffffdb05be642ae0  NotificationEventTHREAD ffffdb05be694080  Cid 1bc8.17dc  Teb: 000000fd877e6000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertableffffdb05be645860  SynchronizationEventffffdb05be646e60  SynchronizationEventffffdb05be645d60  SynchronizationEventTHREAD ffffdb05be7e2080  Cid 1bc8.1020  Teb: 000000fd877e8000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertableffffdb05b68b53a0  NotificationEventffffdb05be651de0  SynchronizationEvent1: kd> .thread ffffdb05bf3c7080
Implicit thread is now ffffdb05`bf3c70801: kd> k*** Stack trace for last set context - .thread/.cxr resets it# Child-SP          RetAddr               Call Site
00 fffff50f`606ed570 fffff800`52c1c9c0     nt!KiSwapContext+0x76
01 fffff50f`606ed6b0 fffff800`52c1beef     nt!KiSwapThread+0x500
02 fffff50f`606ed760 fffff800`52c1b793     nt!KiCommitThreadWait+0x14f
03 fffff50f`606ed800 fffff800`52df04c4     nt!KeWaitForSingleObject+0x233
04 fffff50f`606ed8f0 fffff800`53010cdb     nt!IopWaitForSynchronousIoEvent+0x50
05 fffff50f`606ed930 fffff800`52fcc9e8     nt!IopSynchronousServiceTail+0x50b
06 fffff50f`606ed9d0 fffff800`52ff9ae8     nt!IopReadFile+0x7cc
07 fffff50f`606edac0 fffff800`52e0f3f5     nt!NtReadFile+0x8a8
08 fffff50f`606edbd0 00007ffa`2fb4d124     nt!KiSystemServiceCopyEnd+0x25
09 000000fd`8797e108 00000000`00000000     0x00007ffa`2fb4d124

从卦中看,主线程的内核态栈中的 nt!NtReadFile 函数果然给找到了。

2. 使用 procdump

如果仅仅是看线程的内核态栈,我发现有一个非常简单的方式,就是在 procudump 中多加一个 mk 参数即可,截图如下:

接下来使用 Terminal 执行 procdump,输出如下:


PS C:\Users\Administrator\Desktop> procdump -ma -mk ConsoleApp -o D:\testdumpProcDump v11.0 - Sysinternals process dump utility
Copyright (C) 2009-2022 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com[16:24:49] Dump 1 initiated: D:\testdump\ConsoleApp1.exe_230605_162449.dmp
[16:24:50] Dump 1 writing: Estimated dump file size is 57 MB.
[16:24:50] Dump 1 complete: 57 MB written in 0.1 seconds
[16:24:50] Dump 1 kernel: D:\testdump\ConsoleApp1.exe_230605_162449.Kernel.dmp
[16:24:50] Dump count reached.

从卦中看,当前生成了两个 dmp 文件,一个是用户态dump,一个是内核态dump,也能看到后者还不到 1M,和刚才用 notmyfault 生成的 500M dump 所存储的信息量相差甚远,但对我目前的场景来说已经够用了。

接下来打开 ConsoleApp1.exe_230605_162449.Kernel.dmp 文件,使用 !process 找到 ConsoleApp1.exe 的进程。


..................................................
For analysis of this file, run !analyze -v
nt!DbgkpLkmdSnapThreadInContext+0x95:
fffff804`5e688b51 488364242800    and     qword ptr [rsp+28h],0 ss:0018:ffffe10d`62386fd8=ffffe10d5b8fa810
0: kd> !process 0 2 ConsoleApp1.exe
Unable to read _LIST_ENTRY @ fffff8045ea1e080 
0: kd> .reload /user
Loading User Symbols
0: kd> !process 0 2 ConsoleApp1.exe
Unable to read _LIST_ENTRY @ fffff8045ea1e080 

从卦中看居然报错了,那怎么办呢?办法肯定是有办法的,可以到用户态dump中寻找进程ID即可。


0:000> ~
.  0  Id: 3adc.5920 Suspend: 0 Teb: 000000d6`7cb98000 Unfrozen1  Id: 3adc.2240 Suspend: 0 Teb: 000000d6`7cba0000 Unfrozen2  Id: 3adc.514 Suspend: 0 Teb: 000000d6`7cba2000 Unfrozen3  Id: 3adc.3c68 Suspend: 0 Teb: 000000d6`7cba4000 Unfrozen ".NET Finalizer"

拿到 3adc 进程号后再找下面的主线程,观察它的线程栈信息,输出如下:


0: kd> .process 3adc
Implicit process is now 00000000`00003adc
0: kd> !process
PROCESS ffffcf8d5d5b0080SessionId: none  Cid: 3adc    Peb: d67cb97000  ParentCid: 4c80DirBase: 367d95000  ObjectTable: ffff8e81710bbb40  HandleCount: <Data Not Accessible>Image: ConsoleApp1.exVadRoot ffffcf8d5b20fcb0 Vads 90 Clone 0 Private 1529. Modified 941. Locked 2.DeviceMap ffff8e8172645110Token                             ffff8e815e216060ReadMemory error: Cannot get nt!KeMaximumIncrement value.
fffff78000000000: Unable to get shared dataElapsedTime                       00:00:00.000UserTime                          00:00:00.000KernelTime                        00:00:00.000QuotaPoolUsage[PagedPool]         153768QuotaPoolUsage[NonPagedPool]      12648Working Set Sizes (now,min,max)  (14126, 50, 345) (56504KB, 200KB, 1380KB)PeakWorkingSetSize                14033VirtualSize                       2101882 MbPeakVirtualSize                   2101888 MbPageFaultCount                    15757MemoryPriority                    BACKGROUNDBasePriority                      8CommitCharge                      1628Job                               ffffcf8d53a102c0THREAD ffffcf8d5ae14080  Cid 3adc.5920  Teb: 000000d67cb98000 Win32Thread: ffffcf8d54c3a3b0 RUNNING on processor 0THREAD ffffcf8d4f63e080  Cid 3adc.2240  Teb: 000000d67cba0000 Win32Thread: 0000000000000000 INVALIDTHREAD ffffcf8d69a32080  Cid 3adc.0514  Teb: 000000d67cba2000 Win32Thread: 0000000000000000 INVALIDTHREAD ffffcf8d55003580  Cid 3adc.3c68  Teb: 000000d67cba4000 Win32Thread: 0000000000000000 INVALID0: kd> .thread ffffcf8d5ae14080
Implicit thread is now ffffcf8d`5ae140800: kd> k*** Stack trace for last set context - .thread/.cxr resets it# Child-SP          RetAddr               Call Site
00 ffffe10d`62386fb0 fffff804`5e688a7b     nt!DbgkpLkmdSnapThreadInContext+0x95
01 ffffe10d`623874f0 fffff804`5e01dcd0     nt!DbgkpLkmdSnapThreadApc+0x3b
02 ffffe10d`62387520 fffff804`5e01bb67     nt!KiDeliverApc+0x1b0
03 ffffe10d`623875d0 fffff804`5e01ad6f     nt!KiSwapThread+0x827
04 ffffe10d`62387680 fffff804`5e01a613     nt!KiCommitThreadWait+0x14f
05 ffffe10d`62387720 fffff804`5e439c68     nt!KeWaitForSingleObject+0x233
06 ffffe10d`62387810 fffff804`5e411fe9     nt!IopSynchronousServiceTail+0x238
07 ffffe10d`623878b0 fffff804`5e20d9f5     nt!NtReadFile+0x599
08 ffffe10d`62387990 00007ffe`6390d184     nt!KiSystemServiceCopyEnd+0x25
09 000000d6`7c9fe328 00000000`00000000     0x00007ffe`6390d184

怎么样,上面的 nt!NtReadFile+0x599 函数就是。

三:总结

有时候真的需要去抓内核态dump,总有一些千奇百怪的问题,太难了,这里总结一下给后来人少踩坑吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353326.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

win7配置magic mouse和keyboard

记录一下我是如何在win7下配置magic mouse 和keyboard的。 首先打开笔记本的蓝牙&#xff0c;然后进入到控制面板&#xff0c;找到添加设备。 键盘很好添加&#xff0c;当屏幕显示一串数字时&#xff0c;到键盘上去按对应的数字键就行了。 让我意外的鼠标的配置&#xff0c;…

NYOJ 348 Magic

题目链接&#xff1a;http://acm.nyist.net/JudgeOnline/problem.php?pid348 题意&#xff1a;给你n张牌&#xff0c;让你变一个魔术&#xff1a;第1次把上面的1张牌放到底部&#xff0c;然后最上面的牌就是1&#xff0c;然后拿走1。第2次把上面的2张牌依次放到底部&#xff…

D. Magic Gems

http://codeforces.com/contest/1117/problem/D 题意&#xff1a;n&#xff0c;m(1e18) &#xff1b;有一些魔法石&#xff0c;一个魔法石可以分裂成m个普通宝石&#xff0c;每个宝石站一个单位空间&#xff1b;问有多少集合使得站n个空间&#xff1b; 思路&#xff1a; #inc…

以全能之力造非凡旗舰:荣耀Magic3系列新品发布

8月12日&#xff0c;标志性全能科技旗舰荣耀Magic3系列新品正式发布&#xff0c;荣耀Magic3、荣耀Magic3 Pro、荣耀Magic3至臻版三款机型集中亮相。 融合秩序美学、高端材质、美妙破晓时刻&#xff0c;造就非凡设计&#xff1b;延续荣耀AI与影像优势&#xff0c;首次将电影工业…

【实用工具】magic-api接口快速开发框架

【实用工具】magic-api接口快速开发框架 magic-api是一个基于Java的接口快速开发框架&#xff0c;编写接口将通过magic-api提供的UI界面完成&#xff0c;自动映射为HTTP接口。 无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发。 …

magics24安装教程|magics中文版下载

magics24是由Materialise公司推出的一款功能强大的平面数据处理软件&#xff0c;通过它&#xff0c;能够使用户用最短的前置时间提供高质量样品&#xff0c;并在此过程提供全部文件&#xff0c;非常实用。该软件在完整性、灵活性、强大行和易用性等各个方面都具有不可代替的优势…

C# Winform控件包 MaterialSkin使用教程 免费开源,支持中文!

如果没有拿到控件包DLL的可以去这篇文章里自取。C# Winform控件包分享&#xff0c;免费开源&#xff0c;支持中文&#xff01; 控件比较多&#xff0c;我会抽出时间分控件逐一书写教程&#xff0c;不定时更新&#xff0c;感兴趣的朋友可以关注我。 本文将在以下几个方面进行指…

5.2.6 地址解析协议ARP

5.2.6 地址解析协议ARP 我们知道要想实现全球范围内主机之间的通信&#xff0c;必须要有两个统一&#xff0c;一个是地址&#xff0c;另一个是数据格式&#xff0c;我们使用IP地址来实现统一的地址&#xff0c;使用IP分组实现统一的数据格式&#xff0c;在前面局域网的学习中我…

如何利用MES系统进行生产防呆防错?

一、认识MES系统的防呆防错功能 首先&#xff0c;我们要清楚了解&#xff0c;什么是MES系统的防呆防错。MES系统防呆防错是指利用MES系统来避免生产过程中的错误和缺陷&#xff0c;保障生产排程和生产过程顺利进行的过程。MES系统防呆防错包括以下方面&#xff1a; 1. 自动识别…

Nginx服务——主配置文件-nginx.conf

一、全局配置的6个模块简介 模块说明全局块全局配置&#xff0c;对全局生效events块配置影响 Nginx 服务器与用户的网络连接http块配置代理&#xff0c;缓存&#xff0c;日志定义等绝大多数功能和第三方模块的配置server块配置虚拟主机的相关参数&#xff0c;一个 http 块中可…

《Metasploit渗透测试魔鬼训练营》学习笔记

Metasploit渗透测试魔鬼训练营学习笔记 法律常识 《中华人民共和国网络安全法》已由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议于2016年11月7日通过&#xff0c;现予公布&#xff0c;自2017年6月1日起施行。 第二十条 国家支持企业和高等学校、职业学…

青魔法Python(持续更新)

*跳转到文章结尾* https://www.cnblogs.com/Asterism-2012/p/10047356.html 目录 注释的学问 青魔法Python-圣诞快乐 python源于圣诞节&#xff0c;他的创造者是Guido van Rossum&#xff08;贤者-龟叔&#xff09;。 操作系统:Windows10,Linux Ubuntu 编译器&#xff1…

Metasploit渗透测试魔鬼训练营

信息搜集 外围情报搜集物理机有网状态下物理机无网状态下个人推测获取的信息 主机探测与端口扫描活跃主机扫描ICMP Ping命令Metasploit的主机发现模块arp_sweep使用方法使用Nmap进行主机探测-sn选项扫描-Pn选项扫描-PU选项 操作系统辨识-O选项扫描-A选项扫描 端口扫描与服务类型…

刺客信条4黑旗黑屏无响应闪退解决方案(限于A卡)

鼠标右键【Radeon设置】&#xff1a; 找到游戏&#xff0c;点击调整游戏图形&#xff1a; 3.【将调整游戏图形】显卡一栏的所有优化全部关掉&#xff1a; 4.【高级】一栏上同&#xff1a; 5.重新进入游戏。

起源鸿蒙虚无等级,《刺客信条:起源》或为开放世界游戏 最高等级只有40

《刺客信条&#xff1a;起源》虽然是刺客信条系列的最新作&#xff0c;但是游戏的改动非常大&#xff0c;与之前的刺客系列作品截然不同。而从目前官方公布的情报来看&#xff0c;育碧似乎是想把《巫师3》的叙事手法和《塞尔达传说&#xff1a;荒野之息》的开放世界融合到这款游…

刺客信条 奥德赛的性能测试软件要求,《刺客信条:奥德赛》硬件配置要求测试!买Xbox One X性价比高!...

10月4日&#xff0c;无论是黄金版还是普通版玩家都已经解锁《刺客信条&#xff1a;奥德赛》&#xff0c;前往美轮美奂的古希腊世界探险。跟之前育碧魁北克负责操刀的《刺客信条&#xff1a;枭雄》相比&#xff0c;这次获得的评价正面很多&#xff0c;对于开放世界的塑造的评价大…

《刺客信条:英灵殿》全面分析:浅谈公式化开放世界

经过澳大利亚艺术家8个小时左右的艺术创作之后&#xff0c;育碧正式公布了刺客信条系列的最新一部作品——《刺客信条&#xff1a;英灵殿》的信息。受玩家万众瞩目的刺客信条系列终于在短暂的沉寂后&#xff0c;重新回到广大玩家们的视野之中。如今&#xff0c;《刺客信条》新作…

刺客信条全球眼终结者 绿色破解版

点击下载来源&#xff1a;刺客信条全球眼终结者 绿色破解版 刺客信条全球眼终结者是一款国产的视频监控软件&#xff0c;该软件是配合摄像头一起使用的&#xff0c;用户通过它可以轻易的查看到你监控区域的任何画面。刺客信条全球眼终结者与其他视频监控软件相比它有着明显的优…

MobileViT详解:轻型,通用,移动友好的视觉变压器

MobileViT详解&#xff1a;轻型&#xff0c;通用&#xff0c;移动友好的视觉变压器 0. 引言1. 网络结构2. 模型详解2.1 MobileViT Block2.1.1 Local representations2.1.2 Transformers as Convolutions (global representations)2.1.3 Fusion 2.2 MV2 3. 简化版理解4. 总结 0.…

html5需要很高的电脑配置,上古卷轴5需要什么配置要求 配置要求高吗

上古卷轴5是一款非常好玩的动作角色扮演类游戏&#xff0c;那么有很多用户想要在需要什么样的电脑配置才能流畅的运行这款游戏呢&#xff1f;下面就通过这篇文章给大家介绍一下&#xff0c;一起往下看吧&#xff01; 处理器&#xff1a;Intel酷睿i5-750或AMD Phenom II X4-945(…