C# 使用windbg评估小型转储

C# 使用windbg评估小型转储,c#,debugging,windbg,handles,C#,Debugging,Windbg,Handles,我用C#(.NET4.0)编写了一个程序,并与C#Express的发布助手一起分发 它对我的大多数用户来说都很好,只有一个例外。安装时,他收到一个错误,我的应用程序已停止工作。所以他向我发送了这个错误的mdmp文件,这样我就可以对它进行评估以得到错误 问题是,我不知道怎么做。我找了一些WINDBG up的教程,并试图使用它们,但它们没有帮助 我也试过了。但我无法接近把手 是否有任何方法可以评估此文件以便找出错误?您可能需要执行完整(用户模式)转储,以便它捕获句柄表的状态,以便您可以使用WinDB

我用C#(.NET4.0)编写了一个程序,并与C#Express的发布助手一起分发

它对我的大多数用户来说都很好,只有一个例外。安装时,他收到一个错误,我的应用程序已停止工作。所以他向我发送了这个错误的mdmp文件,这样我就可以对它进行评估以得到错误

问题是,我不知道怎么做。我找了一些WINDBG up的教程,并试图使用它们,但它们没有帮助

我也试过了。但我无法接近把手


是否有任何方法可以评估此文件以便找出错误?

您可能需要执行完整(用户模式)转储,以便它捕获句柄表的状态,以便您可以使用WinDBG等进行事后分析

此处对差异的描述:

如果安装了WinDBG并且发生了崩溃,则可以使用WinDBG命令创建包含更多信息的转储文件,例如使用“h”选项在小型转储中包含“句柄”信息

或者您可以使用DebugDiagnostics 1.2工具,该工具对客户稍微友好一些……您可以创建完整的用户转储


如果要查看.NET堆栈帧并查看转储中捕获的其他NET运行时状态,则需要加载SOS.DLL(Strike之子)以访问转储中的信息……这是一个WinDBG扩展,安装在计算机上时随.NET framework一起分发

如前所述,您需要加载原始调试机器上相同版本的mscordacwks.dll(NET2)/cor.dll(NET4)和sos.dll…这可能会很痛苦

有一个解决方案……如果您将WinDBG设置为指向Microsoft Symbol服务器,即:

  • 创建一个名为c:\symbols的目录
  • 在WinDBG中添加此符号路径,即“SRVc:\symbols”
然后,理论上,如果您的计算机上还没有与目标计算机上使用的网络版本相匹配的mscordacwks.dll/cor.dll,则会从符号服务器下载

或者,您可以使用PSSCOR来避免所有这些恶作剧……它没有与特定mscordacwks/cor.dll版本的紧密绑定

加载PSSCOR2(NET 2)或PSSCOR4(NET 4)扩展…取决于应用程序运行的网络框架版本…PSSCOR是SOS的超集。在您的情况下,您希望加载PSSCOR4(忘记常规SOS)

    • 您可以从中受益。正如其他人所说,您需要为.NET进行完全转储

      请注意,这可能是数百MB,而不是.MDMP文件的1 MB。您需要解释如何将其发送给您

      如果您拥有转储,则不一定需要WinDbg。您还可以在VisualStudio中打开转储文件(不过,对于快速版不确定)。如果您可以在VisualStudio中打开它,可能会更方便

      请注意,对于WinDbg,您还需要目标计算机上的文件
      mscordacwks.dll
      SOS.dll
      ,除非它与您的版本完全相同。由于SXS功能,它们可以位于不同的位置。也许最好把它们都弄到手。就为了你,我发布了最新消息

      作为WinDbg的起点,以下命令应该会有所帮助:

      *** configure symbols to be downloaded from Microsoft
      .symfix c:\symbols
      *** Reload anything which has been loaded so far
      .reload
      *** Load the .NET extension, because WinDbg itself is native only
      .loadby sos clr
      *** Or, if the version is different to your system
      .load c:\filesfromcustomer\sos.dll
      *** Print exception information
      !pe
      *** Get the callstack
      !clrstack
      

      您可能需要进行完全转储,这样它可以捕获句柄表的状态,这样您就可以使用WinDBG等进行事后分析。这里的区别描述:那么我如何强制我的应用程序或windows进行完全转储而不是小型转储?您是如何得出您首先需要句柄表的结论的?小型转储中已经有很多信息了。您得到的错误是什么?analyze-v告诉你什么?为了获得一个完整的转储,imo最简单的工作工具是从sysinternals创建procdump。我是否从迷你转储创建完整的转储?比如在崩溃发生的机器上打开WinDBG中的小型转储,或者我该怎么做?不,你不能从现有的“小型转储”文件创建“完全转储”…你必须在崩溃的进程上创建完全转储…所以在他的机器上。获取使用上述工具创建的完整转储…然后使用他提供给您的.dmp文件,然后您可以在WinDBG中“打开”它并在您的计算机上进行分析。请参阅此处:。。。有关有用的WinDBG资源列表,非常感谢您的努力。我一定要试试这个!您已链接到用于收集用户模式转储的MSDN页面。然而,第一段澄清了这不适用于.NET应用程序。我不认为这会帮助我得到一个完整的转储。@MarcoFrost:这句话中有一个if语句:
      应用程序可以自己定制崩溃报告
      。我认为您的应用程序没有自己的崩溃报告。如果这样做,您只需将正确的参数传递给
      minidumpWriteDomainp()
      方法。@MarcoFrost:它适用于.NET应用程序。我已经指示我们所有的测试人员使用这个特性。在系统测试期间,每当应用程序崩溃时,我都会得到至少一个崩溃转储,这非常有用,因为问题并不总是可再现的。我曾尝试通过
      .loadby sos clr
      加载.NET扩展,但在调用LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos)时收到以下错误消息
      失败,Win32错误0n193“%1是keine zulässige Win32 Anwendung。”
      因此我尝试了您的收集器并加载了mscordacwks.dll和sos.dll。但是,当执行
      时!pe
      I receive
      未能找到运行时DLL(mscorwks.DLL),0x80004005扩展命令需要mscorwks.DLL才能执行操作。