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

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

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

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

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

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

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

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

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

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

  1. 0:007> ~0s
  2. ntdll!NtReadFile+0x14:
  3. 00007ff9`f37cd624 c3 ret
  4. 0:000> !clrstack
  5. OS Thread Id: 0x5464 (0)
  6. Child SP IP Call Site
  7. 0000007F83B7E310 00007ff9f37cd624 [InlinedCallFrame: 0000007f83b7e310]
  8. 0000007F83B7E310 00007ff9c02c76eb [InlinedCallFrame: 0000007f83b7e310]
  9. 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]
  10. 0000007F83B7E3D0 00007ff9c02cc9c0 System.ConsolePal+WindowsConsoleStream.ReadFileNative(IntPtr, System.Span`1, Boolean, Int32 ByRef, Boolean) [/_/src/libraries/System.Console/src/System/ConsolePal.Windows.cs @ 1150]
  11. 0000007F83B7E430 00007ff9c02cc8bb System.ConsolePal+WindowsConsoleStream.Read(System.Span`1) [/_/src/libraries/System.Console/src/System/ConsolePal.Windows.cs @ 1108]
  12. 0000007F83B7E470 00007ff9c02cfb84 System.IO.ConsoleStream.Read(Byte[], Int32, Int32) [/_/src/libraries/System.Console/src/System/IO/ConsoleStream.cs @ 34]
  13. 0000007F83B7E4E0 00007ff975ce8aa1 System.IO.StreamReader.ReadBuffer() [/_/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs @ 613]
  14. 0000007F83B7E530 00007ff975ce9184 System.IO.StreamReader.ReadLine() [/_/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs @ 802]
  15. 0000007F83B7E5E0 00007ff9c02d005d System.IO.SyncTextReader.ReadLine() [/_/src/libraries/System.Console/src/System/IO/SyncTextReader.cs @ 77]
  16. 0000007F83B7E630 00007ff9c02c9319 System.Console.ReadLine() [/_/src/libraries/System.Console/src/System/Console.cs @ 752]
  17. 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,可以查看到源代码所对应的机器代码,和机器代码前面的地址。

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

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

  1. 0:000> bp 00007ff9`1df71961

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

  1. 0:000> bp 00007ff9`1df81961
  2. 0:000> g
  3. (2cf8.2978): Access violation - code c0000005 (first chance)
  4. First chance exceptions are reported before any exception handling.
  5. This exception may be expected and handled.
  6. 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. 【赵渝强老师】使用Weblogic的WLST工具

    一.什么是Weblogic WLST? WebLogic 脚本工具 (WebLogic Scripting Tool , WLST) 是一种命令行脚本界面,系统管理员和操作员用它来监视和管理 WebL ...

  2. LeetCode 1000. Minimum Cost to Merge Stones (区间 DP)

    根据寒神题解 https://leetcode.com/problems/minimum-cost-to-merge-stones/discuss/247567/JavaC%2B%2BPython-D ...

  3. promise是什么?它有哪些作用?

    promsie是es6新增的特性,用来解决回调地狱的问题(异步深层嵌套问题) : 也叫做期约函数,是js内部的构造函数 ,可以当作一个容器,里面保存着某个未来才会结束的事件,比如异步请求 :

  4. 云原生周刊:Istio 1.19 发布 | 2023.9.11

    开源项目推荐 Timoni Timoni 是 Kubernetes 的软件包管理器,由 CUE 提供支持,灵感来自 Helm. Timoni 项目致力于改善编写 Kubernetes 配置的用户体验. ...

  5. 一次彻底掌握数据中心级的JVM调优实战经验

    出现内存溢出的场景通常发生在应用程序中存在内存泄漏.对象生命周期过长.对象频繁创建但未能及时回收等问题.以下是几个真实的业务场景,结合内存溢出问题,并从多个角度提出优化方法,来提高内存使用效率. 场景 ...

  6. Octave 安装教程

    Octave 用心写著. Octave为GNU项目下的开源软件.同时它也是一种语言,专注于解决线性计算问题.因为对于矩阵计算的优化,使得其速度远高于循环计算.语法兼容Linux shell. Octa ...

  7. bresenham算法(贝汉明算法)

  8. golang slice相关常见的性能优化手段

    介绍一些开发中常用的slice关联的性能优化手段.鉴于golang编译器本身捉鸡的优化能力,优化的成本就得分摊在开发者自己的头上了. 这篇文章会介绍的优化手段是下面这几样: 创建slice时预分配内存 ...

  9. 强化学习:如何计算被环境系统截断的terminated state的value值 —— (Bootstrap returns from value estimates if episode is terminated by timeout)

    本文主题:如何计算强化学习中被环境系统截断的terminated state的value值 首先解释一下什么是强化学习中的terminated state的value值,强化学习就是一个智能体(age ...

  10. 居然都到 7.x版本了!!!雷池 WAF 社区版 7.x 的体验记录

    雷池 WAF 简介 雷池 WAF,英文名 "SafeLine",由长亭科技出品的一款 Web 应用防火墙,可以保护 Web 服务不受黑客攻击,早年就以 "智能语义分析技术 ...