【问题标题】:SOS commands fail while live debugging a process which has multiple versions of CLR loaded在实时调试加载了多个 CLR 版本的进程时,SOS 命令失败
【发布时间】:2011-03-03 07:27:04
【问题描述】:

我有一个 ASP.net 2.0 应用程序,我正在尝试使用 Windbg 和 SOS.dll 进行实时调试。 当我将调试器附加到进程时,我看到它同时加载了 2.0 和 4.0 版本的 CLR。​​[mscorwks.dll 和 CLR.dll]。我通过 - .loadby sos mscorwks 加载我的 SOS。 在此之后,我的 SOS 命令都不起作用。我收到“请求线程存储失败”、“无法从系统域获取信息”等。

我了解到这是由于不同版本的 CLR 的 mscordacwks.dll 不匹配。但是我在谷歌上找到的所有使用cordll命令加载正确版本的mscordacwks的解决方案都未能解决我的问题。 特别是,我使用了 .cordll –ve –lp 但似乎没有任何区别。再次执行“!threads”命令后,我得到了

"CLR DLL 状态:加载的 DLL C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll

请求线程存储失败”

我在stackoverflow 中看到another entry 解决了这个问题。但对他来说幸运的是,在提出解决方案之前问题就消失了,而且这不是 this entry

如果有任何线索可以帮助我在我的进程中加载​​ 2 个版本的 CLR 来使用 SOS 扩展,我们将不胜感激。

MSCORDACWKS 版本加载行为如下-

**0:033>** .cordll -e 
CLR DLL status: Loaded DLL C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll 
**0:033>** .cordll -ve -u -lp C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll
 CLR DLL status: No load attempts 
**0:033>** .cordll -e
 CLR DLL status: No load attempts
 **0:033>** !threads 
CLRDLL: Loaded DLL C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscordacwks.dll Failed to request ThreadStore 

【问题讨论】:

  • 好问题。当您执行.cordll -ve -lp 时,有关 mscordacwks 的输出是什么?
  • @Brian - 我已经用我看到的 .cordll 的典型行为更新了我的问题。 .cordll -ve -lp 获得“无加载尝试”。但是,如果我在那之后执行任何其他 sos 命令,它会立即加载 4.0 mscordacwks 并向我抛出错误消息“无法请求线程存储”等。
  • 我遇到了完全相同的问题:/windbg 一直在加载 .NET 4 dll。如果您得到答案,或者如果您在 Microsoft 论坛中有任何与您的案例相关的公共 URL...请发回 :)
  • 当时的调试器版本是什么?我在使用 .cordll -ve -se -u -I 72f60000 -lp C:\WINNT\Microsoft.NET\Framework\v2.0.50727\ 的版本 6.12.0002.633 x86 上遇到了同样的问题,我坚持了一会儿,检测到 -I
    实际上是一个大写字母,但即使这样,它也不起作用,所以我想知道我是否只是得到了同样的错误。

标签: windbg sos


【解决方案1】:

我遇到了同样的问题,并与 Microsoft 取得了联系。使用在BUILD会议期间发布的最新版本的windbg,我能够加载.net 2版本的数据访问库。

Windbg 版本包含在Windows 8 driver kit 中。我能够使用以下命令加载 mscorwks 数据访问库:

.cordll -I mscorwks -lp <path to mscorwks dll>

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我已经尝试过该博客建议的解决方案。第一个选项给出“.cordll -ve -se -u -I 79e70000 -N 注意:此代码不受支持并且可能不起作用。不要报告您遇到的任何问题。CLR DLL 状态:无负载尝试测试新的 CLR 接口”而第二个与互联网上的其他建议一样无效。 “0:025> .cordll -ve -se -u -I 79e70000 -lp C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ CLR DLL 状态:无加载尝试”。我的windbg版本是6.12.0002.633 X86,我的服务器是windows server 2003 32位。
    • 那么很可能需要一些特殊的配置,这在博文中是没有的。如果我是你,我会毫不犹豫地向 Microsoft 提出支持案例。
    • 是的 Lex,我确实为此向 MS 开了一个案例。如果我得到相同的解决方案,将更新线程。
    【解决方案3】:

    今天我也遇到了同样的问题,我能找到的所有命令都不起作用:(

    然后我尝试使用较旧的调试器加载转储,它可以工作。我的版本是6.7.5.0,幸好我的机器上还有一些旧版本可用:)

    【讨论】:

      【解决方案4】:

      我今天仍然面临这个问题。

      我找到了一个适合我的解决方案(假设 mscordacwks.dll 和 sos.dll 存储在文件夹“C:\sos”中):

      .cordll -I mscorwks -lp "C:\sos"
      .loadby sos mscorwks
      !clrstack
      

      此解决方案适用于以下版本的 WinDbg:

      1. 10.0.15063(Windows 工具包 10)
      2. 6.2.9200(Windows Kits 8.0)

      已在 Win7 x86 和 Win10 x64 上测试。

      【讨论】:

        【解决方案5】:

        我有一个与 MS 一起打开的案例,我得到的回复是 -

        “这是调试器的一个问题,产品团队正在解决这个问题。”

        我想我将不得不等待即将发布的 windbg 版本修复此问题或探索其他工具!

        谢谢!

        【讨论】:

        • 如果我正在分析转储,加载 sos 工作正常。但是当我将实时 SSMS 编辑器附加到 windbg 时,它也不适合我。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多