1

我正在尝试使用 Microsoft.Diagnostics.Runtime .NET 组件(也称为 ClrMD)中的功能读取 crash.dmp。

我在已知位置(在名为 pathToFile 的字符串中)有一个 crash.dmp,所以这不是问题。其余代码如下所示。

DataTarget dataTarget = DataTarget.LoadCrashDump(pathToFile);
ClrInfo clrInfo = dataTarget.ClrVersions[0];
string dacLocation = clrInfo.TryGetDacLocation();

测试此代码时,我在命令窗口中收到以下错误:

错误处理目录:System.ArgumentOutOfRangeException。指数超出范围。必须是非负数且小于集合的大小。参数名称:索引。

我假设这与 ClrVersions[0] 位有关,但不能为我的生活确定下来。

任何帮助,将不胜感激。

当前状态 运行以下命令时(失败)

ClrRuntime rt = dataTarget.CreateRuntime("path\to\mscordawks.dll");

我在此进程和 dac 之间的 cmd 架构不匹配中收到以下错误

干杯

任何人?

4

3 回答 3

1

我在读取同一台计算机上生成的转储文件时遇到了同样的问题。有两个问题,第一个问题(应该是 64,在 32 中运行),第二个更难的问题是无法找到正确的 DLL。为了解决第二个问题,我创建了一个方法来尝试它可以找到的所有正确命名的 DLL:

private static ClrRuntime GetRuntime(DataTarget target)
{
    ClrInfo version = target.ClrVersions[0];

    string dacLocation = version.TryGetDacLocation();

    // If we don't have the dac installed, we will use the long-name dac in the same folder.
    if (!string.IsNullOrEmpty(dacLocation))
        dacLocation = version.DacInfo.FileName;

    try  // try the one it should be
    {
        return target.CreateRuntime(dacLocation);
    }
    catch (Exception e)
    {
    }

    // can't find the one it should be, try'em all
    string fileName = "mscordacwks.dll";
    string[] searchLocations = new[]
    {
        @"C:\Windows\Microsoft.NET\",
        @"C:\Windows\winsxs\"
    };

    foreach (string searchLocation in searchLocations)
    {
        foreach (string file in Directory.GetFiles(searchLocation, fileName, SearchOption.AllDirectories))
        {
            try
            {
                return target.CreateRuntime(file);
            }
            catch (Exception e)
            {
            }
        }
    }
    throw new Exception("No found valid runtimes");            
}
于 2014-10-02T19:43:04.947 回答
1

如果 TryGetDacLocation 成功,那么您应该可以执行 ClrRuntime rt = dataTarget.CreateRuntime(dacLocation); 所以你得到正确的 dacLocation。

您正在分析的转储是在您分析它的同一台机器上生成的吗?此外,生成转储的进程的位数、运行 CLRMD 代码的进程以及用于生成转储的调试器实用程序的位数是多少?

通常,您希望全面匹配位数(x86/x64)。

道格

于 2014-03-26T12:33:14.397 回答
0

在处理获取 dmp 文件的位置和进行分析的机器之间的平台差异时,我按照这个人为的方法来获取 mscordacwks.dll。

http://chentiangemalc.wordpress.com/2014/04/16/obtaining-correct-mscordacwks-dll-for-net-windbging/#comment-3380 并遵循包括重命名文件以包含架构和版本信息的步骤。

之后我只是http://chentiangemalc.wordpress.com/2014/04/16/obtaining-correct-mscordacwks-dll-for-net-windbging/#comment-3380ut文件的完整路径作为脚本中的 dacLocation。

之后它起作用了!

我怀疑将它放在路径上可能会起作用。

于 2014-08-22T22:14:54.723 回答