当我们通过 WinDbg 启动一个 .NET 的程序时,WinDbg 将会在运行可执行之前执行一个中断,此时还没有加载 .NET 的运行时。

但是,SOS 扩展需要 clr.dll 或者 coreclr.dll 的支持。所以,在这个时间点执行 SOS 的扩展指令会遇到如下的错误:

0:000> .load C:\Users\Guanjun\.dotnet\sos\sos.dll
0:000> !threads
Failed to find runtime module (coreclr.dll or clr.dll or libcoreclr.so), 0x80004002
Extension commands need it in order to have something to do.
For more information see https://go.microsoft.com/fwlink/?linkid=2135652

解决的方式是使用 g 命令继续执行托管程序,此时会自动加载需要的模块,其中包括了 coreclr.dll,如下所示:

0:000> g
ModLoad: 00007ff9`f1c80000 00007ff9`f1caf000 C:\WINDOWS\System32\IMM32.DLL
ModLoad: 00007ff9`c15d0000 00007ff9`c1629000 C:\Program Files\dotnet\host\fxr\8.0.6\hostfxr.dll
ModLoad: 00007ff9`be1c0000 00007ff9`be224000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\hostpolicy.dll
ModLoad: 00007ff9`7d990000 00007ff9`7de76000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\coreclr.dll
ModLoad: 00007ff9`f2170000 00007ff9`f229b000 C:\WINDOWS\System32\ole32.dll
ModLoad: 00007ff9`f2360000 00007ff9`f26b3000 C:\WINDOWS\System32\combase.dll
ModLoad: 00007ff9`f2ce0000 00007ff9`f2dad000 C:\WINDOWS\System32\OLEAUT32.dll
ModLoad: 00007ff9`f14c0000 00007ff9`f1542000 C:\WINDOWS\System32\bcryptPrimitives.dll
(3c64.5464): Unknown exception - code 04242420 (first chance)
ModLoad: 00007ff9`758e0000 00007ff9`7656d000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\System.Private.CoreLib.dll
ModLoad: 00007ff9`86690000 00007ff9`86849000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\clrjit.dll
ModLoad: 00007ff9`eec50000 00007ff9`eec62000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll
ModLoad: 0000022e`dcc00000 0000022e`dcc08000 C:\Study\DotNet\chapter_02\02TypeSample\bin\Debug\net8.0\02TypeSample.dll
ModLoad: 0000022e`dcc20000 0000022e`dcc2e000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\System.Runtime.dll
ModLoad: 00007ff9`c02c0000 00007ff9`c02e8000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\System.Console.dll
ModLoad: 00007ff9`cf080000 00007ff9`cf092000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\System.Threading.dll
ModLoad: 0000022e`de5d0000 0000022e`de5d8000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\System.Text.Encoding.Extensions.dll
ModLoad: 00007ff9`cf540000 00007ff9`cf555000 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.6\System.Runtime.InteropServices.dll
(3c64.c54): Break instruction exception - code 80000003 (first chance)
ntdll!DbgBreakPoint:
00007ff9`f37d1090 cc int 3

在 coreclr.dll 加载之后,使用 WinDbg 中的工具栏中的 Break 按钮,或者快捷键 Alt+Del, 或者 Ctrl + Brak 进行中断。

也可以在代码中使用 Console.ReadLine() 进行等待,或者使用 Debugger.Break() 语句进行中断。

中断之后,就可以使用 SOS 的扩展命令了,例如上面的 !threads

:007> !threads
ThreadCount: 2
UnstartedThread: 0
BackgroundThread: 1
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
Lock
DBG ID OSID ThreadOBJ State GC Mode GC Alloc Context Domain Count Apt Exception
0 1 5464 0000022EDCC71C00 2a020 Preemptive 0000022EE1012940:0000022EE1014600 0000022edccb6fb0 -00001 MTA
6 2 974 0000022EDCC99A30 21220 Preemptive 0000000000000000:0000000000000000 0000022edccb6fb0 -00001 Ukn (Finalizer)

可以切换到 0 托管线程,然后查看线程堆栈。

0:007> ~0s
ntdll!NtReadFile+0x14:
00007ff9`f37cd624 c3 ret
0:000> !clrstack
OS Thread Id: 0x5464 (0)
Child SP IP Call Site
0000007F83B7E310 00007ff9f37cd624 [InlinedCallFrame: 0000007f83b7e310]
0000007F83B7E310 00007ff9c02c76eb [InlinedCallFrame: 0000007f83b7e310]
0000007F83B7E2E0 00007ff9c02c76eb Interop+Kernel32.ReadFile(IntPtr, Byte*, Int32, Int32 ByRef, IntPtr) [/_/src/libraries/System.Console/src/Microsoft.Interop.LibraryImportGenerator/Microsoft.Interop.LibraryImportGenerator/LibraryImports.g.cs @ 412]
0000007F83B7E3D0 00007ff9c02cc9c0 System.ConsolePal+WindowsConsoleStream.ReadFileNative(IntPtr, System.Span`1, Boolean, Int32 ByRef, Boolean) [/_/src/libraries/System.Console/src/System/ConsolePal.Windows.cs @ 1150]
0000007F83B7E430 00007ff9c02cc8bb System.ConsolePal+WindowsConsoleStream.Read(System.Span`1) [/_/src/libraries/System.Console/src/System/ConsolePal.Windows.cs @ 1108]
0000007F83B7E470 00007ff9c02cfb84 System.IO.ConsoleStream.Read(Byte[], Int32, Int32) [/_/src/libraries/System.Console/src/System/IO/ConsoleStream.cs @ 34]
0000007F83B7E4E0 00007ff975ce8aa1 System.IO.StreamReader.ReadBuffer() [/_/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs @ 613]
0000007F83B7E530 00007ff975ce9184 System.IO.StreamReader.ReadLine() [/_/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs @ 802]
0000007F83B7E5E0 00007ff9c02d005d System.IO.SyncTextReader.ReadLine() [/_/src/libraries/System.Console/src/System/IO/SyncTextReader.cs @ 77]
0000007F83B7E630 00007ff9c02c9319 System.Console.ReadLine() [/_/src/libraries/System.Console/src/System/Console.cs @ 752]
0000007F83B7E660 00007ff91df7195c Advanced.NET.Debugging.Chapter2.TypeSample.Main(System.String[]) [C:\Study\DotNet\chapter_02\02TypeSample\Program.cs @ 37]

如果需要查看 Main() 方法的内容,可以直接点击 Main() 方法前面的链接 [00007ff91df7195c](!U /d 00007ff91df7195c),这相当与输入命令 !U /d 00007ff91df7195c,可以查看到源代码所对应的机器代码,和机器代码前面的地址。

0:000> !U /d 00007ff91df7195c
Normal JIT generated code
Advanced.NET.Debugging.Chapter2.TypeSample.Main(System.String[])
ilAddr is 0000022EDCC02154 pImport is 00000200ED1EBB50
Begin 00007FF91DF71930, size 49 C:\Study\DotNet\chapter_02\02TypeSample\Program.cs @ 36:
00007ff9`1df71930 55 push rbp
00007ff9`1df71931 4883ec30 sub rsp,30h
00007ff9`1df71935 488d6c2430 lea rbp,[rsp+30h]
00007ff9`1df7193a 33c0 xor eax,eax
00007ff9`1df7193c 8945fc mov dword ptr [rbp-4],eax
00007ff9`1df7193f 488945f0 mov qword ptr [rbp-10h],rax
00007ff9`1df71943 48894d10 mov qword ptr [rbp+10h],rcx
00007ff9`1df71947 833ddac9080000 cmp dword ptr [00007ff9`1dffe328],0
00007ff9`1df7194e 7405 je 02TypeSample!Advanced.NET.Debugging.Chapter2.TypeSample.Main+0x25 (00007ff9`1df71955)
00007ff9`1df71950 e86badc95f call coreclr!JIT_DbgIsJustMyCode (00007ff9`7dc0c6c0)
00007ff9`1df71955 90 nop C:\Study\DotNet\chapter_02\02TypeSample\Program.cs @ 37:
00007ff9`1df71956 ff151c2d0d00 call qword ptr [00007ff9`1e044678]
>>> 00007ff9`1df7195c 488945f0 mov qword ptr [rbp-10h],rax
00007ff9`1df71960 90 nop C:\Study\DotNet\chapter_02\02TypeSample\Program.cs @ 39:
00007ff9`1df71961 c745fc0a000000 mov dword ptr [rbp-4],0Ah C:\Study\DotNet\chapter_02\02TypeSample\Program.cs @ 40:
00007ff9`1df71968 8b4dfc mov ecx,dword ptr [rbp-4]
00007ff9`1df7196b ff15df2d0d00 call qword ptr [00007ff9`1e044750]
00007ff9`1df71971 90 nop C:\Study\DotNet\chapter_02\02TypeSample\Program.cs @ 52:
00007ff9`1df71972 90 nop
00007ff9`1df71973 4883c430 add rsp,30h
00007ff9`1df71977 5d pop rbp
00007ff9`1df71978 c3 ret

例如,可以看到源代码第 39 行对应的地址为 00007ff91df71961,在这里下一个断点的方式就是使用 bp` 指令。

0:000> bp 00007ff9`1df71961

继续使用 g 执行程序,可以看到 WinDbg 在执行到源代码的第 39 行停了下来。

0:000> bp 00007ff9`1df81961
0:000> g
(2cf8.2978): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
00007ff9`1df811d0 0000 add byte ptr [rax],al ds:00007ff9`1df811d0=00

WinDbg: Failed to find runtime module (coreclr.dll or clr.dll or libcoreclr.so)的更多相关文章

  1. WinDbg x 64 使用 SOS: 无法找到运行时 DLL (clr.dll)

     http://www.datazx.cn/Forums/en-US/59aa78c9-dc05-43c8-9efe-e7b132056afc/action?threadDisplayName=win ...

  2. 配置php时。提示的错误session_start(): Failed to initialize storage module解决办法

    当浏览器输入访问地址后 报这样的错时----session_start(): Failed to initialize storage module 进入到此目录vi /usr/local/php/e ...

  3. Module build failed: Error: Cannot find module 'url-loader' 的坑

    本文地址:http://www.cnblogs.com/jying/p/8280956.html 开发环境:react.webpack.es5 引用图片报错:Module build failed: ...

  4. atom markdown报错:AssertionError: html-pdf: Failed to load PhantomJS module.

    今天安装markdown-pdf之后运行的时候报错: AssertionError: html-pdf: Failed to load PhantomJS module. You have to se ...

  5. atom markdown转换PDF 解决AssertionError: html-pdf: Failed to load PhantomJS module

    atom编辑器markdown转换PDF 解决AssertionError: html-pdf: Failed to load PhantomJS module. You have to set th ...

  6. Module build failed: Error: Cannot find module 'node-sass'

    安装npm 遇到 Module build failed: Error: Cannot find module 'node-sass' 这次通过重装 npm 完成 先卸载npm npm uninsta ...

  7. vue项目报错,解决Module build failed: Error: Cannot find module 'node-sass' 问题

    1.报错问题 1 E:\WebStormFile\treehole-manage>npm run dev > xc-ui-pc-sysmanage@1.0.0 dev E:\WebStor ...

  8. dotnet部署出现Failed to load the dll from [ ... hostfxr.dll], HRESULT: 0x80070057

    起因 最近看到.net core 3支持wpf了,尝试一下(如果可行,会特别利于脱离.net运行时) dotnet new wpf dotnet publish -c Release -r win-x ...

  9. CLR调试时的sos.dll/clr.dll/mscorwks.dll/mscordacwks.dll等动态库的版本对应

    大家都知道,在调试托管代码时,一定会加载到sos/clr/mscorwks/mscordacwks这些动态库,才能够很好的完成我们的调试工作,那么他们的版本对应关系是怎样的呢,特别是clr.dll/m ...

  10. 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)

    SQLite部署-无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 近期刚使用SQLite,主要引用的是System.Data.SQLite.dll这个dll,在部署到测试 ...

随机推荐

  1. 阿里云Centos7修改MariaDB数据库连接时间,解决连接mysql报Too many connection的问题

    在测项目的时候突然发现数据库连接不上了,提示Too many connection. 产生问题的原因是MySQL的Sleep进程占用了大量的连接,当时是重启mysql解决的这个问题!后来又配置了连接池 ...

  2. 《Vue.js 设计与实现》读书笔记 - 第5章、非原始值的响应式方案

    第5章.非原始值的响应式方案 5.1 理解 Proxy 和 Reflect Proxy Proxy 只能代理对象,不能代理非对象原始值,比如字符串. Proxy 会拦截对对象的基本语义,并重新定义对象 ...

  3. ptmalloc、tcmalloc与jemalloc对比分析

    背景介绍 在开发微信看一看期间,为了进行耗时优化,基础库这层按照惯例使用tcmalloc替代glibc标配的ptmalloc做优化,CPU消耗和耗时确实有所降低.但在晚上高峰时期,在CPU刚刚超过50 ...

  4. linux中backport printk和front printk的区别

    在Linux内核中,"backport printk"和"front printk"都是用于记录内核消息和调试信息的机制,但它们的工作方式和使用场景有一些区别. ...

  5. kotlin关键字与操作符

    硬关键字:始终解释为关键字,不能用作标识符 as - 用于类型转换 - 为导入指定一个别名 as? 用于安全类型转换 break 终止循环的执行 class 声明一个类 continue 继续最近层循 ...

  6. NJU ICS2024 PA 作业心得(二)

    NJU ICS2024 PA 作业心得(二) RTFSC问题处理 这部分一定要很仔细很仔细的阅读RISCV的手册,否则后边会吃苦头的. 我们这里从框架的角度对取指之前和执行之后的操作进行一些简要的补充 ...

  7. appium环境搭建及命令行启动sdk模拟器-附踩坑以及解决过程

    安装教程这里就不阐述了,网上一大堆教程,下载完成后安装然后配置对应的环境变量即可 android sdk及java home配置: path配置: %ANDROID_HOME%\platform-to ...

  8. 自建家庭 KTV,在家想嗨就嗨

    现在用户最多.曲库最多的 K 歌软件是全民K歌,基本上想唱的歌都有,而且基本上每首歌都有 MV 或视频,使用体验也还不错,但是收费太贵了,对于一个月唱不了几次的打工人来说,唱一首歌就是"天价 ...

  9. 递推(C语言)

    文章目录 1.斐波那契数列 2.太波那契数列 3.二维递推问题 4.实战 4.1 力扣509 斐波那契数 4.2 力扣70 爬楼梯 4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列,递推和数 ...

  10. 【性能测试】01基础知识篇-并发用户、RPS、TPS的解读

    本文介绍并发用户.RPS.TPS的基本概念以及三者之间的关系. 术语定义 并发用户:在性能测试工具中,一般称为虚拟用户(Virtual User,简称VU),指的是现实系统中操作业务的用户. 说明 并 ...